一、會話技術(shù)
客戶端之間的通話:Cookie技術(shù)
服務器端會話技術(shù):Session技術(shù)
目的是在一次會話中共享數(shù)據(jù)蹲诀。
1、Cookie技術(shù)
使用Cookie的步驟:
- 1.一個Servlet中畸悬、創(chuàng)建一個Cookie對象,存入鍵值對信息
Cookie cookie = new Cookie("msg","こんにちは");
- 2.使用response對象的 void addCookie(Cookie var1);方法添加Cookie到當前會話中侧甫。
response.addCookie(cookie);
- 3.另一個Servlet中、使用request對象獲取Cookie對象數(shù)組蹋宦。
Cookie[] cookies = request.getCookies();
- 4.通過Cookie的getName()方法和getValue()方法,獲取存入的鍵值對信息
String name = cookie.getName();
String value = cookie.getValue();
Cookie的原理:
image.png
Cookie的生命周期
Cookie默認是存儲在瀏覽器內(nèi)存中的咒锻,當瀏覽器關(guān)閉后冷冗,Cookie就消失了。
可以設置Cookie的生命周期:
setMaxAge(int seconds)
- 正數(shù):將Cookie數(shù)據(jù)寫到硬盤的文件中惑艇。
持久化存儲蒿辙。并指定cookie存活時間拇泛,時間到后,cookie文件自動失效思灌。 - 負數(shù):默認值
- 零:刪除cookie信息
Tomcat 8 之后俺叭,Cookie可以存儲中文數(shù)據(jù)了!
Cookie的共享范圍
- 1.同一個Tomcat之間泰偿、不同項目之間Cookie默認是不共享的熄守。
設置 cookie.setPath("/");后,不同項目之間就能共享了耗跛。 - 2.不同Tomcat之間裕照,默認Cookie也是不能共享的。
設置一級域名相同可以實現(xiàn)不同服務器之間的Cookie共享调塌。
cookie.setDomain(String path)
例如: cookie.setDomain(".TopDomain.com");則sub1.TopDomain.com和sub1.TopDomain.com之間的cookie是可以共享的晋南。
如何修改Cookie
- 1.獲取該cookie
- 2.使用cookie.setValue(String value);方法設置新值
- 3.使用response.AddCookie(cookie)返回到響應頭中
Tomcat 8 對特殊字符還是無法處理,cookie的value不讓用特殊字符羔砾,比如說空格
解決方法:
存儲:將value值轉(zhuǎn)換為URL編碼负间,URLEncoder.encode(value,"utf-8");
存入cookie中。
使用:要使用的話姜凄,先解碼唉擂,URLDecoder.decode(value,"utf-8");
再使用即可
cookie的特點
- cookie存儲數(shù)據(jù)在客戶端瀏覽器
- 瀏覽器對于單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數(shù)量也有限制(20個)
2、Session技術(shù)
Session是服務器端的會話技術(shù)檀葛,依賴于Cookie來進行數(shù)據(jù)共享玩祟。
1. 獲取HttpSession對象:
HttpSession session = request.getSession();
2. 使用HttpSession對象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
原理:
image.png
注意點:
- 當客戶端關(guān)閉后,服務器不關(guān)閉屿聋,兩次獲取session是否為同一個空扎?
默認情況是不是同一個,因為關(guān)閉客戶端也就是關(guān)閉了會話润讥,Cookie就消失了转锈,之前的session也找不到了。
延長銷毀時間:
把JSESSIONID手動存入Cookie中楚殿,并延長Cookie的存活時間撮慨。
- 當客戶端關(guān)閉后,服務器不關(guān)閉屿聋,兩次獲取session是否為同一個空扎?
- 客戶端不關(guān)閉,服務器關(guān)閉后脆粥,兩次獲取的session是同一個嗎砌溺?
顯然不是、服務器關(guān)閉了变隔,服務器中的session對象就全部銷毀了规伐。
延長銷毀時間:
session鈍化+session活化、簡單來說就是把session對象序列化到硬盤上匣缘,當服務器啟動時猖闪,再反序列化到服務器中即可鲜棠,把session對象存起來。
- 客戶端不關(guān)閉,服務器關(guān)閉后脆粥,兩次獲取的session是同一個嗎砌溺?
-
3.session什么時候被銷毀培慌?
- 關(guān)閉服務器
- 自殺豁陆,session對象調(diào)用invalidate()方法,銷毀所有session對象
-
一段時間不活動后吵护,銷毀session對象盒音,默認30分鐘。
image.png
session的特點:
- 1.session存儲數(shù)據(jù)到服務器端何址,沒有大小限制里逆。
- 2.session可以存儲任意類型數(shù)據(jù)。
- 3.session存儲在服務器端用爪,比cookie安全原押。