javaweb03_Cookie和Session
Cookie
Cookie 是保存在客戶端的鍵值對,它可以彌補HTTP協議無狀態的不足,
服務端創建并發送Cookie物件給瀏覽器:
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+"");
//設定Cookie的有效期為1天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
服務端獲取Cookie:
Cookie[] cookies = req.getCookies();
Cookie有效期:
- 默認情況下,當瀏覽器關閉后,Cookie資料被銷毀
- setMaxAge()設定Cookie有效期后,時間到了Cookie將自動失效
- 一般使用setMaxAge(0)來洗掉Cookie
Cookie中文字符問題:
- 在 tomcat8 之前cookie存盤中文字符需要轉碼
//編碼
Cookie cookie = new Cookie("name",URLEncoder.encode("張三","utf-8"));
resp.addCookie(cookie);
//解碼
URLDecoder.decode(cookie.getValue(),"utf-8");
- 在 tomcat8 之后cookie支持中文資料的存盤
單個cookie的大小上限值為4KB
瀏覽器存盤同一個域名下的總cookie數量也有限制,不同瀏覽器可存盤的cookie數量不同
session
Session保存在服務器上,是另一種記錄客戶狀態的機制
當客戶端第一次訪問服務器時,服務器默認為每個瀏覽器創建不同的HttpSession物件,然后發送一個JSESSIONID給客戶端
這個JSESSIONID本質上就是一個Cookie
后續客戶端訪問服務器時都會帶上這個JSESSIONID,服務端利用 JSESSIONID 判斷哪個Session屬于該客戶端
獲取session:
HttpSession session = request.getSession();
//獲取sessionid,其值就是JSESSIONID
String id = session.getId();
String name = (String) session.getAttribute("name");
設定session:
session.setAttribute("name","BLU");
設定Session的有效期:
<!-- 單位為分鐘 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
手動銷毀session:
session.invalidate();
問題:當瀏覽器關閉后,JSESSIONID就會消失,再次訪問的時候又重新創建了一個新的session物件,這樣比較消耗資源,
解決辦法:手動創建JSESSIONID并手動設定其有效期:
HttpSession session = request.getSession();
String id = session.getId();
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setMaxAge(60*30);
response.addCookie(cookie);
思考:如果沒有cookie,session如何作業?‘
如果瀏覽器把cookie功能關閉,那么服務端就無法獲取jsessionid,每一次訪問,都會生成一個新的session物件,
解決辦法:
<a href="<%=response.encodeURL("hello.jsp")%>">hello</a>
當客戶端cookie被禁用時,response.encodeURL方法會把jsessionid存入地址欄:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/112545.html
標籤:其他
上一篇:日常學習之webpack①
