衆所周知,我們瀏覽器與服務器之間的交流是通過Http(TCP/IP的應用層協議,超文本傳輸協議)協議約定的,一次請求對應一次響應
Http協議是一個無狀態協議,意味着每一次的請求都是獨立的,後續處理無法獲取之前的數據,無法實現數據之間的共享,所以需要時就只能通過重傳,但是這樣會導致每次連接傳送的數據量增大
現在我們來說一說解決方案:
1、使用參數傳遞機制,使用get傳遞,可以將參數拼接在URL之後,但是這種方式不安全,傳遞的參數數量有限
2、使用Cookie技術
3、使用Session技術
一、Cookie技術
*特點:客戶端的技術,將共享數據保存在客戶端(瀏覽器)中
Cookie可以分爲內存Cookie(非持久cookie)和硬盤Cookie(持久Cookie)
*cookie操作:
1、創建cookie對象,設置共享數據:Cookie c = new Cookie(String name,String value);但是一個cookie只能存儲一個字符串類型的數據,不能存儲其他類型的數據
2、將Cookie響應給瀏覽器:response對象.addCookie(cookie對象)
3、獲取請求中的Cookie信息:Cookie[] cs = request對象.getCookies();
for(Cookie c:cs){
if("username".equals(c.getName())){
String value = c.getValue();
}
}
4、修改Cookie中的共享數據
(1)重新創建一個新的cookie,名稱和要修改的數據一致
(2)先獲取到要修改的cookie對象,在調用setValue(String newValue)重新設置,修改cookie中的數據,需要再次發送給瀏覽器
5、cookie的生命週期
默認:在關閉瀏覽器的時候銷燬Cookie對象
語法:void setMaxAge(int expiry)
expiry > 0:設置 Cookie 對象能夠存活 expiry 秒,即使關閉瀏覽器,也不影響 Cookie 中的共享數據,比如設置一個月:setMaxAge(60*60*24*30);
expiry = 0:立即刪除當前的 Cookie 信息,通過setMaxAge(0)
來實現
expiry < 0:關閉瀏覽器時銷燬
6、Cookie中的key和value不支持中文
設置Cookie時需要對中文字符串進行編碼,在獲取時進行解碼
7、Cookie的路徑和域範圍可以進行設置
*Cookie的缺陷:
(1)獲取Cookie信息比較麻煩
(2)Cookie不支持中文
(3)一個Cookie只能存儲一個字符串類型的數據
(4)Cookie在瀏覽器中有大小和數量的限制
(5)共享數據時保存在瀏覽器中容易造成數據的泄露,不安全
二、Session技術
特點:服務器端技術,將數據保存在服務器
理解:cookie可以讓服務器端程序跟蹤每個客戶端的訪問,但是每次客戶端的訪問必須重新回傳cookie到服務器上,cookie很多時就會增加客戶端與服務器的數據傳輸量,session就是用以解決這個問題的
同一個客戶端每次與服務器交互時,不需要每次都回傳有所得cookie值,而只需要回傳一個id,這個id是用戶第一次訪問時產生的,而且每個客戶端都是唯一的,這個id通常是name爲jsesionid的一個cookie
session基本操作
1、獲取session對象:request.getSession()
2、設置共享數據:session對象.setAttribute(String name,Object value)
注意:session可以存儲任何類型的數據
3、修改共享數據:重新設置一個同名的共享數據
4、獲取共享數據:Object value = Session對象.getAttribute(String name);
5、刪除Session中的共享數據Session.removeAttribute(String name);
6、銷燬session:void invalidate()
7、session的超時管理
超時:在訪問當前資源的過程中,不和網頁進行任何的交互,超過設定的時間即爲超時
tomocat服務器中默認的配置爲30分鐘
語法:void setMaxInactiveInterval(int interval)