servlet中cookie和session操作


1.1 軟件中的會話

一次會話: 打開瀏覽器 -> 訪問一些服務器內容 -> 關閉瀏覽器

 

登錄場景:

打開瀏覽器 -> 瀏覽到登陸頁面 -> 輸入用戶名和密碼 -> 訪問到用戶主頁(顯示用戶名)

修改密碼(輸入原密碼)

 修改收貨地址

.......

 

問題:在此處登錄會話過程中產生的數據(用戶會話數據)如何保存下來呢?

 

購物場景:

 打開瀏覽器 -> 瀏覽商品列表  -> 加入購物車(把商品信息保存下來)  -> 關閉瀏覽器

 打開瀏覽器->  直接進入購物車 -> 查看到上次加入購物車的商品 -> 下訂單 -> 支付

 

問題: 在購物會話過程中,如何保存商品信息??

 

會話管理: 管理瀏覽器客戶端 服務器端之間會話過程中產生的會話數據。

 

域對象: 實現資源之間的數據共享。

 

request域對象

context域對象

 

登錄場景:

小張: 輸入“張三” (保存數據: context.setAttribute("name","張三")-> 用戶主頁(顯示“張三”)

小李: 輸入“李四”(保存數據:context.setAttribute("name","李四")) -> 用戶主頁(顯示“李四”)

 

問題: context是所有用戶公有的資源!!!會覆蓋數據。

 

小張: 輸入“張三”(保存數據: request.setAttribute("name","張三")- > 用戶主頁(顯示“張三”) 問題: 一定要使用轉發技術來跳轉頁面!!!

 

解決辦法: 可以使用session域對象來保存會話數據!!!

1.2 會話技術

Cookie技術:會話數據保存在瀏覽器客戶端。

Session技術:會話數據保存在服務器端。

 

 

2 Cooke技術

2.1 特點

Cookie技術:會話數據保存在瀏覽器客戶端。

2.2 Cookie技術核心

Cookie類:用於存儲會話數據

 

1)構造Cookie對象

Cookie(java.lang.String name, java.lang.String value)

2)設置cookie

void setPath(java.lang.String uri)   :設置cookie的有效訪問路徑

void setMaxAge(int expiry)  設置cookie的有效時間

void setValue(java.lang.String newValue) :設置cookie的值

3)發送cookie到瀏覽器端保存

void response.addCookie(Cookie cookie)  : 發送cookie

4)服務器接收cookie

Cookie[] request.getCookies()  : 接收cookie

 

2.3 Cookie原理

1)服務器創建cookie對象,把會話數據存儲到cookie對象中。

new Cookie("name","value");

2 服務器發送cookie信息到瀏覽器

response.addCookie(cookie);

 

舉例: set-cookie: name=eric  (隱藏發送了一個set-cookie名稱的響應頭)

3)瀏覽器得到服務器發送的cookie,然后保存在瀏覽器端。

4)瀏覽器在下次訪問服務器時,會帶着cookie信息

    舉例: cookie: name=eric  (隱藏帶着一個叫cookie名稱的請求頭)

5)服務器接收到瀏覽器帶來的cookie信息

request.getCookies();

 

2.4 Cookie的細節

1void setPath(java.lang.String uri)   :設置cookie的有效訪問路徑。有效路徑指的是cookie的有效路徑保存在哪里,那么瀏覽器在有效路徑下訪問服務器時就會帶着cookie信息,否則不帶cookie信息。

 

2void setMaxAge(int expiry)  設置cookie的有效時間。

正整數:表示cookie數據保存瀏覽器的緩存目錄(硬盤中),數值表示保存的時間。

負整數:表示cookie數據保存瀏覽器的內存中。瀏覽器關閉cookie就丟失了!!

零:表示刪除同名的cookie數據

3Cookie數據類型只能保存非中文字符串類型的。可以保存多個cookie,但是瀏覽器一般只允許存放300Cookie,每個站點最多存放20Cookie,每個Cookie的大小限制為4KB

 

3 Session技術

3.1 引入

Cookie的局限:

1Cookie只能存字符串類型。不能保存對象

2)只能存非中文。

31Cookie的容量不超過4KB

 

如果要保存非字符串,超過4kb內容,只能使用session技術!!!

 

Session特點:

會話數據保存在服務器端。(內存中)

 

3.2 Session技術核心

HttpSession類:用於保存會話數據

 

1)創建或得到session對象

HttpSession getSession()  

HttpSession getSession(boolean create)  

2)設置session對象

void setMaxInactiveInterval(int interval)   設置session的有效時間

void invalidate()      銷毀session對象

java.lang.String getId()   得到session編號

3)保存會話數據到session對象

void setAttribute(java.lang.String name, java.lang.Object value)   保存數據

java.lang.Object getAttribute(java.lang.String name)   獲取數據

void removeAttribute(java.lang.String name) 清除數據

3.3 Session原理

問題: 服務器能夠識別不同的瀏覽者!!!

現象:

 

   前提: 在哪個session域對象保存數據,就必須從哪個域對象取出!!!!

瀏覽器1(s1分配一個唯一的標記:s001,s001發送給瀏覽器)

1)創建session對象,保存會話數據

HttpSession session = request.getSession();   --保存會話數據 s1

瀏覽器1 的新窗口(帶着s001的標記到服務器查詢,s001->s1,返回s1

1)得到session對象的會話數據

    HttpSession session = request.getSession();   --可以取出  s1

 

新的瀏覽器1(沒有帶s001,不能返回s1)

1)得到session對象的會話數據

    HttpSession session = request.getSession();   --不可以取出  s2

 

瀏覽器2(沒有帶s001,不能返回s1)

1)得到session對象的會話數據

    HttpSession session = request.getSession();  --不可以取出  s3

 

 

代碼解讀:HttpSession session = request.getSession();

 

1)第一次訪問創建session對象,給session對象分配一個唯一的ID,叫JSESSIONID

new HttpSession();

2)把JSESSIONID作為Cookie的值發送給瀏覽器保存

Cookie cookie = new Cookie("JSESSIONID", sessionID);

response.addCookie(cookie);

3)第二次訪問的時候,瀏覽器帶着JSESSIONIDcookie訪問服務器

4)服務器得到JSESSIONID,在服務器的內存中搜索是否存放對應編號的session對象。

if(找到){

return map.get(sessionID);

}

Map<String,HttpSession>]

 

 

<"s001", s1>

<"s001,"s2>

5)如果找到對應編號的session對象,直接返回該對象

6)如果找不到對應編號的session對象,創建新的session對象,繼續走1的流程

 

結論:通過JSESSIONcookie值在服務器找session對象!!!!!

3.4 Sesson細節

1java.lang.String getId()   得到session編號

2)兩個getSession方法:

getSession(true) / getSession()  : 創建或得到session對象。沒有匹配的session編號,自動創 建新的session對象。

getSession(false):              得到session對象。沒有匹配的session編號,返回null

3void setMaxInactiveInterval(int interval)   設置session的有效時間

session對象銷毀時間:

3.1 默認情況30分服務器自動回收

3.2 修改session回收時間

3.3 全局修改session有效時間

 

<!-- 修改session全局有效時間:分鍾 -->

<session-config>

<session-timeout>1</session-timeout>

</session-config>

 

3.4.手動銷毀session對象

void invalidate()      銷毀session對象

4)如何避免瀏覽器的JSESSIONIDcookie隨着瀏覽器關閉而丟失的問題

 

/**

 * 手動發送一個硬盤保存的cookie給瀏覽器

 */

Cookie c = new Cookie("JSESSIONID",session.getId());

c.setMaxAge(60*60);

response.addCookie(c);

 

總結:

1)會話管理: 瀏覽器和服務器會話過程中的產生的會話數據的管理。

 

2Cookie技術:

new Cookie("name","value")

response.addCookie(coookie)

request.getCookies()

3Session技術

request.getSession();

 

setAttrbute("name","會話數據");

getAttribute("會話數據")


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com