session和cookie技術對比
Cooke技術
1 特點
Cookie技術:會話數據保存在瀏覽器客戶端。
2 Cookie技術核心
Cookie類:用於存儲會話數據
1)構造Cookie對象
Cookie(java.lang.String name, java.lang.String value)
2)設置cookie
void setPath(java.lang.String uri) :設置cookie的有效訪問路徑
void setMaxAge(int expiry) : 設置cookie的有效時間
void setValue(java.lang.String newValue) :設置cookie的值
3)發送cookie到瀏覽器端保存
void response.addCookie(Cookie cookie) : 發送cookie
4)服務器接收cookie
Cookie[] request.getCookies() : 接收cookie
3 Cookie原理
1)服務器創建cookie對象,把會話數據存儲到cookie對象中。
new Cookie("name","value");
2) 服務器發送cookie信息到瀏覽器
response.addCookie(cookie);
舉例: set-cookie: name=eric (隱藏發送了一個set-cookie名稱的響應頭)
3)瀏覽器得到服務器發送的cookie,然後保存在瀏覽器端。
4)瀏覽器在下次訪問服務器時,會帶著cookie信息
舉例: cookie: name=eric (隱藏帶著一個叫cookie名稱的請求頭)
5)服務器接收到瀏覽器帶來的cookie信息
request.getCookies();
4 Cookie的細節
1)void setPath(java.lang.String uri) :設置cookie的有效訪問路徑。有效路徑指的是cookie的有效路徑保存在哪裏,那麽瀏覽器在有效路徑下訪問服務器時就會帶著cookie信息,否則不帶cookie信息。
2)void setMaxAge(int expiry) : 設置cookie的有效時間。
正整數:表示cookie數據保存瀏覽器的緩存目錄(硬盤中),數值表示保存的時間。
負整數:表示cookie數據保存瀏覽器的內存中。瀏覽器關閉cookie就丟失了!!
零:表示刪除同名的cookie數據
3)Cookie數據類型只能保存非中文字符串類型的。可以保存多個cookie,但是瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
Session技術
1 引入
Cookie的局限:
1)Cookie只能存字符串類型。不能保存對象
2)只能存非中文。
3)1個Cookie的容量不超過4KB。
如果要保存非字符串,超過4kb內容,只能使用session技術!!!
Session特點:
會話數據保存在服務器端。(內存中)
2 Session技術核心
HttpSession類:用於保存會話數據
1)創建或得到session對象
HttpSession getSession()
HttpSession getSession(boolean create)
2)設置session對象
void setMaxInactiveInterval(int interval) : 設置session的有效時間
void invalidate() : 銷毀session對象
java.lang.String getId() : 得到session編號
3)保存會話數據到session對象
void setAttribute(java.lang.String name, java.lang.Object value) : 保存數據
java.lang.Object getAttribute(java.lang.String name) : 獲取數據
void removeAttribute(java.lang.String name) : 清除數據
3 Session原理
服務器能夠識別不同的瀏覽者!!!
代碼解讀:HttpSession session = request.getSession();
1)第一次訪問創建session對象,給session對象分配一個唯一的ID,叫JSESSIONID
2)把JSESSIONID作為Cookie的值發送給瀏覽器保存
3)第二次訪問的時候,瀏覽器帶著JSESSIONID的cookie訪問服務器
4)服務器得到JSESSIONID,在服務器的內存中搜索是否存放對應編號的session對象。
5)如果找到對應編號的session對象,直接返回該對象
6)如果找不到對應編號的session對象,創建新的session對象,繼續走1的流程
結論:通過JSESSION的cookie值在服務器找session對象!!!!!
4 Sesson細節
1)java.lang.String getId() : 得到session編號
2)兩個getSession方法:
getSession(true) / getSession() : 創建或得到session對象。沒有匹配的session編號,自動創 建新的session對象。
getSession(false): 得到session對象。沒有匹配的session編號,返回null
3)void setMaxInactiveInterval(int interval) : 設置session的有效時間
session對象銷毀時間:
3.1 默認情況30分服務器自動回收
3.2 修改session回收時間
3.3 全局修改session有效時間
<!-- 修改session全局有效時間:分鐘 --> <session-config> <session-timeout>1</session-timeout> </session-config> |
3.4.手動銷毀session對象
void invalidate() : 銷毀session對象
4)如何避免瀏覽器的JSESSIONID的cookie隨著瀏覽器關閉而丟失的問題
/** * 手動發送一個硬盤保存的cookie給瀏覽器 */ Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c); |
總結:
1)會話管理: 管理瀏覽器和服務器之間的會話過程中產生的會話數據
2)Cookie技術: 會話數據保存在瀏覽器客戶端。
Cookie核心的API:
2.1 在服務器端創建Cookie對象
Cookeie cookie = new Cookie("name","value");
2.2 把cookie發送給瀏覽器端(通過響應頭:set-cookie)
response.addCookie(cookie);
2.3 瀏覽器帶著cookie信息訪問服務器(通過請求頭:cookie),服務器得到cookie信息
Cookie[] cookies = request.getCookies();
局限:
1)只能保存字符串類型,不能保存中文
2)一個cookie不能超過4kb
3)Session技術:會話數據保存在服務器端。(內存)
Session核心的API:
3.1 創建或得到session對象
HttpSession session = request.getSession(); //創建或得到session對象
request.getSession(false); //得到session對象
3.2 會話數據保存session對象中,和得到會話數據
session.setAttribute("name",Object); 保存數據
session.getAttribute("name") 得到數據
註意:
1)session.setIntactiveInterval(時間); 設置session過期時間
2)session.invalidate() 手動銷毀session對象
session和cookie技術對比