瀏覽器開始訪問網(wǎng)站到結(jié)束期間產(chǎn)生的多次請求響應(yīng)組合是一次會話,
可通過Cookie或Session技術(shù)保存會話產(chǎn)生的數(shù)據(jù)篮奄。
1.Cookie
用于在瀏覽器保存會話數(shù)據(jù)(用戶數(shù)據(jù))
Cookie 大小限制:
瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie最大4KB
Cookie 保存時長:
會話 Cookie: 不設(shè)置過期時間,cookie只在內(nèi)存中,不同瀏覽器進(jìn)程不能共享,瀏覽器關(guān)閉就刪除
持久 Cookie: 設(shè)置過期時間,cookie存到硬盤,可以在不同瀏覽器進(jìn)程間共享,瀏覽器關(guān)閉后依然有效,直到過期時間
1.讀寫Cookie
Cookie[] cookies = request.getCookies(); //獲取Http請求頭 Cookie, 多個鍵值對
Cookie cookie = new Cookie(key,value);
response.addCookie(cookie); //添加Http響應(yīng)頭 set-cookie,通知瀏覽器保存該cookie
2.設(shè)置Cookie的過期時間(Expires)
若不設(shè)置,Cookie默認(rèn)只在瀏覽器內(nèi)存中
cookie.setMaxAge(24*60*60); //瀏覽器只保存1天(在硬盤中)
cookie.setMaxAge(-1); //瀏覽器關(guān)閉就刪除(只在內(nèi)存中,默認(rèn)情況)
cookie.setMaxAge(0); //期限為0,瀏覽器會刪除已存在的cookie
3.設(shè)置Cookie歸屬的域名Domain/路徑Path
若不設(shè)置,默認(rèn)設(shè)置為發(fā)送Cookie的域名Domain/路徑Path
假設(shè)發(fā)送Cookie的資源路徑是: http://www.lioil.win/testWeb/testJ
cookie.setDomain("lioil.com"); //只能若設(shè)置為當(dāng)前域名,或域名一部分
cookie.setPath("/testWeb/testJ");
cookie.setPath("/testWeb/");
cookie.setPath("/");
4.Cookie中文亂碼
Cookie是放在HTTP頭部,而HTTP協(xié)議規(guī)定: 在HTTP頭部只能用標(biāo)準(zhǔn)ACSII字符; 所以瀏覽器用ACSII解析中文出現(xiàn)亂碼
解決方法: 對中文進(jìn)行URL編碼轉(zhuǎn)為ACSII字符(URLEncoder/URLDecoder)
其實Cookie的中文亂碼不需要解決, 雖然把Cookie傳到瀏覽器顯示亂碼了, 但再傳回來服務(wù)器解碼就可以恢復(fù)中文=P獭<劢场!
chrome瀏覽器設(shè)置界面可以查看Cookie的中文內(nèi)容(估計是UTF-8解碼)
2.Session
1)定義
在服務(wù)器保存會話數(shù)據(jù)(用戶數(shù)據(jù))
生存周期:
創(chuàng)建: 首次調(diào)用reqeust.getSession()創(chuàng)建
銷毀: 手動調(diào)用session.invalidate()銷毀, 或session超時銷毀, 或服務(wù)器非正常關(guān)閉銷毀;
session鈍化: 服務(wù)器正常關(guān)閉,未超時的session會保存在硬盤(tomcat/work)
session活化: 再啟動服務(wù)器,鈍化session恢復(fù)到內(nèi)存
默認(rèn)超30分鐘沒有訪問session對象就銷毀
在tomcat/conf/web.xml 或 web項目/web.xml 配置session的超時時長
<session-config>
<session-timeout>60</session-timeout>
</session-config>
session = request.getSession();
session.getAttribute();
session.getAttributeNames();
session.setAttribute();
session.removeAttribute();
session.invalidate();
session.getId();
session.isNew();
session.getCreationTime();
session.getMaxInactiveInterval();
2)原理
調(diào)用request.getSession(),
檢查Http請求頭有無cookie(sessionID),
如果有,則找到服務(wù)器對應(yīng)session,
如果無,則檢查Http請求URL有無sessionID,
如果有,則找到服務(wù)器對應(yīng)session,
如果無,則認(rèn)為瀏覽器無對應(yīng)Session,創(chuàng)建Session,并在Http響應(yīng)頭添加cookie(sessionID)
默認(rèn)情況下,cookie(sessionID)沒有設(shè)置MaxAge,只在內(nèi)存中(不同瀏覽器無法公用),關(guān)閉瀏覽器cookie就丟失,
可手動發(fā)送cookie(sessionID)設(shè)置MaxAge,使cookie存在硬盤中乘瓤。
3)URL重寫
瀏覽器禁用Cookie時,可將所有URL重寫加上sessionID
request.getSession() 在URL重寫前一定要先創(chuàng)建出Session
response.encodeURL() 一般地址重寫
response.encodeRedirectURL() 重定向地址重寫
簡書: http://www.reibang.com/p/be23dbf46392
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54644654
GitHub博客:http://lioil.win/2017/01/21/Servlet-Cookie-Session.html
Coding博客:http://c.lioil.win/2017/01/21/Servlet-Cookie-Session.html