1. 程式人生 > >Servlet 04-Cookie物件 與 常用方法

Servlet 04-Cookie物件 與 常用方法

狀態管理(會話跟蹤) *****

HTTP協議 是 無狀態無連線的 , 客戶端與伺服器的每一次請求與響應 是沒有記憶的 !

將多次互動的資料狀態 儲存起來, 並進行管理, 我們稱其為 狀態管理 !

兩種技術實現: 
    1.  Cookie實現 :  將資料儲存在瀏覽器中
    2.  Session實現:  將資料儲存在伺服器中

Cookie技術 *****

技術原理: 

    當瀏覽器傳送請求到伺服器時, 伺服器在響應資料時, 可以通過設定Cookie訊息頭的方式, 將Cookie響應給瀏覽器

    瀏覽器會將所有得到的Cookie 儲存在一個文字文件(txt檔案)中, 當瀏覽器再次發起一個指向 同一個域名, 同一個路徑的請求時 , 會自動攜帶上 對應域名與路徑的Cookie

Cookie物件 與 常用方法 *****

Cookie在Java中的體現 是一個 Cookie 類 ! 這個類的物件 可以用於儲存一個鍵值對資料 !(一個Cookie 就是一個 鍵值對 )

常用方法:

1.  構造方法:
    Cookie cookie = new Cookie(String key,String value);

2.  設定Cookie的存活時長
    cookie.setMaxAge(int 秒);
    引數:
        引數型別為int , 不可以超出int型別最大值 !
        -   正數      :   存活的秒數 , 例如: 1年: 1*365*24*60*60
        -   負數  :   預設-1 , 會話結束時自動刪除 (瀏覽器關閉時)
        -   0       :   存活0秒, 表示立即刪除 !

3.  獲取Cookie的key
    String key = cookie.getName();

4.  獲取Cookie的value
    String value = cookie.getValue();

如何將Cookie放到響應的訊息頭中 *****

response.addCookie(Cookie cookie);

可以新增多個Cookie , 相同域相同路徑 相同key的cookie 會產生覆蓋 !

如何從請求頭部 得到Cookie物件 *****

瀏覽器在每次請求伺服器時, 會將對應域名與路徑的Cookie 通過請求的訊息頭髮送到伺服器 ,我們可以通過請求物件 得到Cookie陣列

Cookie[] cookies = request.getCookies();

注意: 如果從未儲存過Cookie , 得到的是null 而不是長度為0的陣列 !

Cookie路徑問題

瀏覽器在向伺服器傳送請求時, 會將域名 與 路徑匹配的Cookie  儲存到請求的訊息頭, 傳送給伺服器 !

    關於Cookie的讀取: 
        只能由儲存路徑  或 儲存路徑子路經完成 !

    關於Cookie的替換與刪除:
        只能由儲存路徑完成 !

案例:

設計三個Servlet 如下: 

http://ip+埠/專案名/x.do   
http://ip+埠/專案名/a/y.do
http://ip+埠/專案名/a/z.do

驗證結果為: 

    使用x儲存時:
        x   :   可以讀取     , 可以替換刪除
        y   :   可以讀取  , 不可替換刪除
        z   :   可以讀取  , 不可替換刪除

    使用z儲存時:
        x   :   不可讀取, 不可替換刪除 !
        y   :   可以讀取     , 可以替換刪除   
        z   :   可以讀取     , 可以替換刪除


其實我們可以不關注路徑問題, 我們可以在建立Cookie後,直接修改路徑 :

一般我們在開發過程中, 為了讓Cookie能更好的獲取與替換 , 會將所有Cookie的路徑設定為根路徑 !


方式:
    cookie.setPath("/");

Cookie的優缺點:

1.  Cookie儲存的資料型別只能是字串  且不支援中文 !
2.  資料儲存在瀏覽器中, 不安全
3.  儲存的資料量存在限制, 最大為4kb
4.  太依賴於使用者對於瀏覽器的設定, 使用者可以禁止使用Cookie