深入理解cookie與session

轉自:http://blog.csdn.net/j903829182/article/details/39855221

 cookie和session是web開發比較基礎也比較重要的知識,cookie和session用於用戶的狀態管理。簡單的來說它們都只是http中的一個配置項,在Servlet規範中也只對應一個類而已;http對cookie的數量和大小有限制,而session不易於在很多的服務器中進行共享。

      Session與Cookie的作用都是爲了保持訪問用戶與後端服務器的交互狀態。他們有各自的優點和缺陷。但一個服務器訪問量很大的時候,比如一天又幾億個pv,假如每個cookie佔用200個字節,那麼它需要多少帶寬了。所以訪問量大的時候希望使用session,但是session的致命弱點是不容易在多臺服務器之間共享,這也限制了session的使用。





















以上的這些資料來自阿里的java web技術內幕


      爲了解決cookie和session的缺陷,並結合他們的優勢,利用session的分佈式框架,可以節省帶寬,和解決session的同步問題,具體的可以參考阿里內部技術資料java web技術內幕。


1.狀態管理
服務器對用戶訪問的狀態進行管理
http請求是一次性請求,但同一用戶可能會通過http協議向服務器發送多次請求
用了管理用戶多次請求(登錄開始到退出爲止,中間多次請求操作爲同一用戶),此時
需要對用戶進行狀態管理
狀體管理的兩種方式:
1.在客戶端保存數據管理狀態(cookie)
2.在服務器端保存數據管理狀態(session)

2.session
用戶首次訪問服務器,服務器會爲每個用戶單獨創建一個session對象(HttpSession),
併爲每個session分配唯一一個id(sessionId),sessionId通過cookie保存到用戶端,
。當用戶再次訪問服務器時,需將對應的sessionId攜帶給服務器,服務器通過這個唯一
sessionId就可以找到用戶對應的session對象,從而達到管理用戶狀態
1.獲得session對象
a.request.getSession(flag);
當flag=true時,服務器會查找用戶是否用sessionId,如果sessionId爲Null,
則服務器會創建一個新的session對象返回給用戶(sessionId)
如果sessionId存在,則會根據對應的sessionId去查找session對象,如果session
對象存在則直接返回,如果不存在則創建新的session對象並返回。
當flag=false;服務器會查找用戶是否用sessionId,如果sessionId爲Null,則返回
爲null,如果sessionId,則會根據對應的sessionId去查找session對象,如果session
對象存在則直接返回,如果不存在則返回爲Null。
b.request.getSession();
等效於request.getSession(true);
2.session常用API
存:session.setAttribute(key,value);
取:session.getAttribute(key);
刪除:session.removeAttribute(key);


-------------------------------------------------------
1.狀態管理
前提:http協議請求是一次性請求。但在通常情況下又需要記住用戶,管理用戶狀態
2.狀態管理方式方法
1.客戶端保存數據(Cookie)
2.服務器端(Session)
3.session
因爲用戶首次訪問,服務器會檢查sessionId沒有則創建session對象,並將對象的sessionId
發送給用戶(response對象,以cookie方式),當用戶再次訪問,需要攜帶對應的sessionId
(request對象,以cookide方式),服務器會檢查對應sessionId,存在則查找對應的session對象
並返回給用戶。如果sessionId存在而對應session對象不存在,服務器會創建新的session對象並
將這個新得到sessionId返回給用戶。
4.session的API
a.HttpSession session=request.getSession(true/false);
b.HttpSession session=request.getSession();
public static HttpSession getSession(){
return getSession(true);
}
//重載的方法之間經常重用
例如:點與圓之間的距離
class Circle{
double getDistance(int x,int y){
return Math.sqrt((this.x-x)(this.x-x)-(this.y-y)(this.y-y));
}
double getDistance(Point p){
return getDistance(p.getX(),p.getY());
}
}
c.session.setAttribute(key,value);
d.session.getAttribute(key);-value(Object)
e.session.removeAttribute(key);
f.session.getSessionId();
【練習】使用session記錄用戶的訪問次數
5.session的有效期
所有用戶的session對象都保存在服務器,則服務器空間有限,所有不能永久保存session
即sesion對象在服務器中保存的有效時間
  設置session有效期:
  1.//設置session有效期
session.setMaxInactiveInterval(15);
2.服務器設置
<session-config>
       <session-timeout>30</session-timeout>
   </session-config>
3.在servlet對應的web.xml中配置
6.踢出session
session.invalidate();
7.Session失效
禁用cookie會導致session失效
原理:客戶端無法保存服務器發送的sessionId,所以訪問時沒有sessionId,那麼根據
session創建原理,服務器會創建新的session對象返回給用戶
解決方式:URL重寫


原文:http://blog.csdn.net/j903829182/article/details/39855221


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章