瀏覽器輸入地址--HTTP請求--Servlet--HTTP響應--瀏覽器接收瀏覽器
會話(session):打開瀏覽器,打開一系列頁面,關閉瀏覽器安全
使用場景:服務器
網購網站的偏好記錄cookie
網站的自動登陸session
瀏覽記錄,如歡迎標語「xxx再次回來」併發
原理:客戶端/服務器端保存會話數據:Cookie(瀏覽器端)/Session(服務器端)post
Cookie:測試
爲了辨別用於身份而儲存在用戶終端的key-value數據網站
工做流程:ui
瀏覽器發出HTTP請求
服務器根據須要生成Cookie對象並把相關數據保存在該對象中
將Cookie對象放在HTTP響應頭中一併發送給瀏覽器
瀏覽器接收到響應後,提出該Cookie並保存;
瀏覽器第二次訪問該服務器時
將Cookie放在請求頭中一併發送給服務器
服務器從請求頭中提取該Cookie對象讀取數據作出個性化的響應
Cookie的生命週期:
默認爲 會話結束後失效 -- 稱爲會話Cookie,通常保存在內存中
setMaxAge設置有效期,保存在硬盤中
Cookie的缺陷:
大小和數量的限制:通常爲每一個站點保存最多20個Cookie,每一個Cookie在4k之內
數據安全性問題:HTTP請求中的Cookie是明文傳遞的
Cookie:
case:登錄
登錄頁面 form post獲取userName和userPassword到user/specify
在user/specify的Servlet中:process() 中
String userName=request.getParameter("userName");
String userPassword=request.getParameter("userPassword");
// 建立Cookie Cookie userNameCookie = new Cookie("userName", userName); Cookie passwordCookie = new Cookie("password", userPassword); // 將Cookie放入對應的響應體中 response.addCookie(userNameCookie); response.addCookie(passwordCookie); // 設置過時時間 userNameCookie.setMaxAge(2 * 60); // unit minute passwordCookie.setMaxAge(2 * 60);
第二次登錄時讀取cookie:
Cookie[] cookies = request.getCookies(); if(cookies != null) { for(Cookie cookie: cookies) { if(cookie.getName().equals("userName")) { userName = cookie.getValue(); } if(cookie.getName().equals("userPassword") { userPassword = cookie.getValue(); } } }
第二次登錄頁面時,打開developer tools--Application--cookies可見詳情
Session:
HTTPSession服務器端爲客戶端建立的對象,用於保存客戶端的狀態數據
工做原理:
瀏覽器端發送HTTP請求到服務器端
服務器端根據請求需求生成一個Session對象,並給該對象附上惟一編號和對應數據
服務器端將Session對象的惟一編號放到Cookie對象中
服務器將HTTP響應返回給瀏覽器端
瀏覽器再次發送請求到該服務器時
服務器收到帶有Seesion id的Cookie以後,取出Session id,找到對應Session對象
辨別出對應用戶後,對用戶進行個性化的響應
Session生命週期
默認有效期30分鐘
setMaxInactiveInterval設置有效期(單位:秒)
部署描述符配置有效期(單位:分鐘)
<session-config> <session-timeout>2</session-timeout> </session-config>
invalidate使Session失效
--優先級:接口 > 部署描述符
case:登錄(在上例Cookie的基礎上)
// 建立HTTPSession對象 HttpSession session = request.getSession(); // 無Session時默認建立新的Session對象
String name = (String) session.getAttribute("userName");
session.setMaxInactiveInterval(2 * 60); // expire time (seconds)
session.invalidate(); // invalidate the session
// 再次請求時
if (name != null) {
syso("second login: " + name);
}
// 將數據放入Session對象
session.setAttribute("userName", userName);
在Chrome--developer tools--Application--Cookies--能夠看到JSESSIONID
總結:
數據存儲:Cookie存在於客戶端;Session存在於服務器端
安全性:Cookie在客戶端明文傳遞;Session存在於服務器端的內存中,安全性較強
生命週期:到時間失效;Cookie時間設置爲第一次訪問開始算起;Session時間設置爲從最後一次訪問開始算起,Session可主動讓其失效
使用原則:Cookie有數量(20)、大小(4k)限制;Session存在於內存,建議大小不要太大
下面哪一種場景沒有使用會話技術?
下面哪項關於Cookie與Session的生命週期說法是錯誤的?
下面哪項說法是錯誤的?
下面哪項對Session的說法是錯誤的?
下面哪項說法是正確的?
Cookie是保存在客戶端,Session是保存在服務端
相對而言,Cookie比Session安全性更高
Cookie是一直會保存在客戶端瀏覽器中
Session有默認的有效期,有效期過了Session數據會失效