1.狀態管理----Cookie
1.1 為什么需要狀態管理
HTTP協議是無狀態的,不能保存每次提交的信息,即當服務器返回與請求相對應的應答之后,這次事務的所有信息就丟掉了。
如果用戶發來一個新的請求,服務器無法知道它是否與上次的請求有聯系。
對於那些需要多次提交數據才能完成的Web操作,比如登錄來說,就成問題了。
1.1.1 什么是狀態管理(會話管理)
指的是一個客戶端的瀏覽器到WEB服務器之間連續發生的一系列請求和響應的過程。
(相當於打電話)從打開瀏覽器訪問某個網站到關閉該網站的過程我們稱為一次會話。
1.1.2狀態管理的兩種常見的模式;
客戶端狀態管理技術:將狀態存放在客戶端。代表性的是Cookie技術(瀏覽器)
服務器狀態管理技術:將狀態存放在服務器中。代表的是Session.
1.2.Cookie應用
1.2.1什么是Cookie
Cookie的創建是由服務器創建,服務端調用相關的方法將Cookie響應給客戶端
一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(name)和設置值(value)。
說明:Cookie 是由鍵值對方式存儲數據 name:jack
一個WEB站可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點
提供的Cookie。
1.2.2Cookie的使用
步驟:
1.創建Cookie
Cookie cookie=new Cookie(“name”,“jack");//鍵值對
2.設置Cookie的路徑
cookie.setPath("/")
3.設置Cookie的生存時間
cookie.setMaxAge(-1)//關閉瀏覽器結束4.把Cookie響應到瀏覽器
response.addCookie(cookie);
1.2.3如何查詢Cookie
//獲取客戶端的Cookie 存儲多個,要用數組
Cookie [] cookies=request.getCookies();
ifcookies!=null)
{
for(Cookie cookie : cookies){
if(cookie.getName().equals(name))
{
String value=cookie.getValue();
System.out.println(value);
}
}
}
1.2.4如何修改Cookie
只要保證Cookie名和路徑一致就行
//先得到指定的Cookie
1.2.5如何刪除Cookie
1.3 Cookie的生存周期
cookies.setMaxAge(-1);//設置生成時間
括號的取值:
>0有效期,單位是秒
=0失效,用於刪除Cookie
<0 內存存儲,關閉瀏覽器失效
1.4 Cookie的編碼與解碼(8.0版本及之前的版本存儲中文需要編碼與解碼)
中文和英文字符不同,中文屬於Unicode字符,在內存中占用4個字符,而英文屬於ASCII字符,內存中只占2個字節。Cookie中使用Unicode字符時需要對Unicode字符進行編碼,否則會出現亂碼。編碼可以使用java.net.URLEncoder類的encode(String str,String encoding)方法,解碼使用java.net.URLDecoder類的decode(String str,String encoding)方法
代碼:
運行結果:
1.5 Cookie的路徑問題
1.5.1什么是Cookie的路徑問題
1.5.2 發送Cookie的條件
瀏覽器在發送請求之前,首先會根據請求url中的域名在cookie列表中找所有與當前域名一樣的cookie,然后再根據指定的路徑進行匹配,如果當前請求在域匹配的基礎上還與路徑匹配那么就會將所有匹配的cookie發送給服務器,這里要注意的是最大匹配和最小匹配問題,有些cookie服務器在發送之前會有意擴大當前頁面cookie的匹配范圍,此時這些被擴大范圍的cookie也會一起發送給服務器。
例如:cookie 存在於: http://localhost:8080/day13_cookie_01/
如果:發送的請求是:http://localhost:8080/day14/aServlet 的話,則不發送cookie到服務端
http://localhost:8080/day13_cookie_01/aServlet能發送cookie到服務器
1.6 Cookie的特點
優點:
1.可配置到期規則 Cookie 可以在瀏覽器會話結束時到期,或者可以在客戶端計算機上無限期存在,這取決於客戶端的到期規則。
2.不需要任何服務器資源 Cookie 存儲在客戶端並在發送后由服務器讀取。
3.簡單性 Cookie 是一種基於文本的輕量結構,包含簡單的鍵值對。
4.數據持久性 雖然客戶端計算機上 Cookie 的持續時間取決於客戶端上的 Cookie 過期處理和用戶干預,
Cookie 通常是客戶端上持續時間最長的數據保留形式
5.cookie.setMaxAge(時間);//單位秒
缺點:
1.大小受到限制 大多數瀏覽器對 Cookie 的大小有 4096 字節的限制,盡管在當今新的瀏覽器和客戶端設備版本中,支持 8192 字節的 Cookie 大小已愈發常見。
2.安全性低,存在於客戶端
3.加密和解密需要額外的編碼,另外解碼和解密耗費一定的時間而影響應用程序的性能
2. 狀態管理---Session
2.1 Session概述
2.1.1什么是Session
Session用於跟蹤客戶的狀態。
Session指的是在一段時間內,單個客戶與Web服務器的一連串相關的交互過程。
在一個Session中,客戶可能會多次請求訪問同一個網頁,也有可能請求訪問各種不同的服務器資源。
2.1.2 Session 工作原理
http:無狀態 無連接
session被用於表示一個持續的連接狀態,在網站訪問中一般指代客戶端瀏覽器的進程從開啟到結束的過程。session其實就是網站分析的訪問(visits)度量,表示一個訪問的過程。
session的常見實現形式是會話cookie(session cookie),即未設置過期時間的cookie,這個cookie的默認生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。
實現機制是當用戶發起一個請求的時候,服務器會檢查該請求中是否包含sessionid,如果未包含,則系統會創造一個名為JSESSIONID的輸出 cookie返回給瀏覽器(只放入內存,並不存在硬盤中),並將其以HashTable的形式寫到服務器的內存里面;當已經包含sessionid是,服務端會檢查找到與該session相匹配的信息,如果存在則直接使用該sessionid,若不存在則重新生成新的 session。
這里需要注意的是session始終是有服務端創建的,並非瀏覽器自己生成的。 但是瀏覽器的cookie被禁止后session就需要用get方法的URL重寫的機制或使用POST方法提交隱藏表單的形式來實現
2.1.3 如何獲得Session
2.1.4 如何使用session綁定對象
使用HttpSession的setAttribute(屬性名,object)方法
2.1.5 如何刪除Session
使用HttpSession的invalidate方法
2.2 Session超時
2.2.1什么是Session超時
HttpSession的最后一程訪問時間和當前時間的差距大於了 指定的最大空閑時間,這時服務器
就會銷毀Session對象。默認的空閑時間為30分鍾。
2.2.2如何修改Session的缺省時間限制
使用HttpSession的setMaxAge設置,單位為秒
2.2.3 Session 失效的幾種情況
1.超過了設置的超時時間
2.主動調用了invalidate方法
3.服務器主動或異常關閉
注意:瀏覽器關閉並不會讓Session失效
Session和Cookie的區別
1,session存放在服務器端,cookie存放在客戶端。
2,session會隨着會話的結束而關閉,cookie則存放在客戶端瀏覽器上長期有效。
3,session保存的是對象,cookie保存的是字符串
4,存放在cookie里的信息容易泄露,通常只保存不重要的信息,重要的信息放在session中