1. 狀態(tài)管理
1.1 為什么需要狀態(tài)管理
WEB應(yīng)用程序使用HTTP協(xié)議通信汉形,而HTTP協(xié)議是“無狀態(tài)”協(xié)議,即服務(wù)器一旦響應(yīng)完客戶的請求之后,就會斷開連接,而同一個客戶的下一次請求將重新建立連接岭埠。
1.2 什么是狀態(tài)管理
狀態(tài):數(shù)據(jù)
管理:多次交互時對數(shù)據(jù)的修改
將客戶端(瀏覽器)與服務(wù)器之間的多次交互(一次請求,一次響應(yīng))當(dāng)做一個整體來看待,并且將多次交互所涉及的數(shù)據(jù)保存下來惜论。
1.3 狀態(tài)管理的兩種常見模式
- 客戶端狀態(tài)管理技術(shù):將狀態(tài)保存在客戶端许赃,代表性的是Cookie技
- 服務(wù)器端狀態(tài)管理技術(shù):將狀態(tài)保存在服務(wù)器端,代表性的是Session技術(shù)
2. Cookie
2.1 什么是Cookie
瀏覽器向Web服務(wù)器發(fā)送請求是来涨,服務(wù)器會將少量的數(shù)據(jù)以set-Cookie消息頭的方式發(fā)送給瀏覽器图焰,瀏覽器將這些數(shù)據(jù)保存下來启盛。當(dāng)瀏覽器再次訪問服務(wù)器時蹦掐,會將這些數(shù)據(jù)已Cookie消息頭的方式發(fā)送給服務(wù)器。
2.2 基本語法
- 創(chuàng)建Cookie
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
name:Cookie的名字用來區(qū)分不同的Cookie
value:Cookie的值(必須是String類型)
- 查詢Cookie
- 獲取客戶端所有的Cookie對象僵闯,但是Cookie也有可能不存在
Cookie[] c = request.getCookies();
- 獲取Cookie對象的名或者值
String Cookie.getName()
String Cookie.getValue()
- 修改Cookie
獲取客戶端發(fā)送的所有Cookie->根據(jù)name找到要修改的Cookie->調(diào)用Cookie的setValue(String newValue)方法修改Cookie的值->將修改后的Cookie加入到response發(fā)送回客戶端
Cookie[] Cookies = request.getCookie();
if(c!=null){
for(Cookie c:Cookies){
String name = c.getName();
if(name=="city"){
c.setValue("Shanghai");
response.addCookie(c);
}
}
}
擴展
- 修改生存時間
默認的情況下卧抗,瀏覽器會將Cookie保存在內(nèi)存中,只要瀏覽器不關(guān)閉鳖粟,Cookie就會一直存在社裆。但是如果希望關(guān)閉瀏覽器后Cookie仍然存在,則需要設(shè)置Cookie的生存時間向图。
Cookie.setMaxAge(int seconds);
seconds > 0: 保存在硬盤上的時間
seconds = 0: 立即刪除
seconds < 0: 默認泳秀,保存在瀏覽器的內(nèi)存中 - 存儲中文
Cookie 只能保存合法的ASCII字符,若要保存中文榄攀,則需要將中文轉(zhuǎn)換成ASCII
-Cookie的編碼
Cookie c = new Cookie("city",URLEncoder.encode("上海","utf-8"));
-Cookie的解碼
Cookie[] Cookies = new Cookie();
if(Cookies!=null){
Cookie c = Cookies[0];
String value = c.getValue();
value = URLDecoder.decode(value,"utf-8");
}
-
如何修改有效路徑
Cookie
設(shè)置Cookie的路徑
Cookie c = new Cookie("name","value");
c.setPath("/app.Name");
//此處用絕對路徑比較好嗜傅,因為當(dāng)前的路徑時不確定的
response.addCookie(c);
3. Session
3.1 什么是Session
瀏覽器訪問Web服務(wù)器是,服務(wù)器會為每一個瀏覽器單獨創(chuàng)建一個Session對象檩赢,而且該對象有一個ID屬性吕嘀,其值是唯一的,可以稱之為SessionId。服務(wù)器會將這個SessionId(使用Cookie的方式)發(fā)送給瀏覽器贞瞒,瀏覽器再次訪問服務(wù)器時偶房,會將SessionId發(fā)送給服務(wù)器,服務(wù)器可以根據(jù)SessionId找到對應(yīng)的Session對象军浆。
3.2 基本語法
- 獲得Session
//獲取Session對象
- 向session中存儲數(shù)據(jù)
Session.setAttribute(String name, Object obj);
//獲取綁定的對象,返回值是Object類型棕洋,去除數(shù)據(jù)時要對其進行數(shù)據(jù)轉(zhuǎn)換,必須與我們存入的數(shù)據(jù)類型一致
Session.getAttribute(String name)
Session.removeAttribute(String name)
- 刪除Session對象
Session.invalidate()
擴展
- 修改session的超時時間
Web服務(wù)器會將空閑時間過長的Session對象刪除以節(jié)省服務(wù)器內(nèi)存空間資源
- 通過Tomcat中的web.xml文件的設(shè)置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- 編程的方式來修改
session.setMaxInactionInterval(int seconds)
- 禁用Cookie的后果
- Session將不能使用了
- 可以通過URL重寫實現(xiàn)Session
//鏈接地址和表單提交
response.encodeURL(String url)
//重定向
response.encodeRedirectURL(String url)
4. Cookie與Session的比較
比較 | Cookie | Session |
---|---|---|
安全性 | 不安全(將狀態(tài)保存在客戶端) | 安全(將狀態(tài)保存在服務(wù)器端) |
存儲的數(shù)據(jù)類型 | String | Object |
存儲數(shù)據(jù)的大小 | 越4k | 更多 |
服務(wù)器壓力 | 服務(wù)器壓力小乒融,將狀態(tài)保存在客戶端 | 服務(wù)器壓力大掰盘,占用服務(wù)器內(nèi)存,如果用戶量過大會影響服務(wù)器的性能 |
5.練習(xí)
Cookie創(chuàng)建簇抵,查找庆杜,修改,中文編碼碟摆,保存時間和路徑問題
Session實現(xiàn)訪問技術(shù)晃财,登錄,超市設(shè)置,URL重寫断盛,驗證碼