1. 程式人生 > >認識Cookie和狀態管理

認識Cookie和狀態管理

  • HTTP協議是一種無狀態的協議,WEB伺服器本身不能識別出哪些請求是同一個瀏覽器發出的 ,瀏覽器的每一次請求都是完全孤立的
  • 即使 HTTP1.1 支援持續連線,但當用戶有一段時間沒有提交請求,連線也會關閉。
  • 作為 web 伺服器,必須能夠採用一種機制來唯一地標識一個使用者,同時記錄該使用者的狀態

會話和會話狀態

  • WEB應用中的會話是指一個客戶端瀏覽器與WEB伺服器之間連續發生的一系列請求和響應過程。
  • WEB應用的會話狀態是指WEB伺服器與瀏覽器在會話過程中產生的狀態資訊,藉助會話狀態,WEB伺服器能夠把屬於同一會話中的一系列的請求和響應過程關聯起來。

實現有狀態的會話

  • WEB伺服器端程式要能從大量的請求訊息中區分出哪些請求訊息屬於同一個會話,即能識別出來自同一個瀏覽器的訪問請求,這需要瀏覽器對其發出的每個請求訊息都進行標識:屬於同一個會話中的請求訊息都附帶同樣的標識號,而屬於不同會話的請求訊息總是附帶不同的標識號,這個標識號就稱之為會話ID(SessionID)。
  • 在 Servlet 規範中,常用以下兩種機制完成會話跟蹤

Cookie 
Session

Cookie機制

  • cookie機制採用的是在客戶端保持 HTTP 狀態資訊的方案
  • Cookie是在瀏覽器訪問WEB伺服器的某個資源時,由WEB伺服器在HTTP響應訊息頭中附帶傳送給瀏覽器的一個小文字檔案。
  • 一旦WEB瀏覽器儲存了某個Cookie,那麼它在以後每次訪問該WEB伺服器時,都會在HTTP請求頭中將這個Cookie回傳給WEB伺服器。
  • 底層的實現原理: WEB伺服器通過在HTTP響應訊息中增加Set-Cookie響應頭欄位將Cookie資訊傳送給瀏覽器,瀏覽器則通過在HTTP請求訊息中增加Cookie請求頭欄位將Cookie回傳給WEB伺服器。
  • 一個Cookie只能標識一種資訊,它至少含有一個標識該資訊的名稱(NAME)和設定值(VALUE)。
  • 一個WEB站點可以給一個WEB瀏覽器傳送多個Cookie,一個WEB瀏覽器也可以儲存多個WEB站點提供的Cookie。
  • 瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。

在Servlet程式中使用Cookie 

  • Servlet API中提供了一個javax.servlet.http.Cookie類來封裝Cookie資訊,它包含有生成Cookie資訊和提取Cookie資訊的各個屬性的方法。
  • Cookie類的方法:

構造方法: public Cookie(String name,String value)

getName方法 
setValue與getValue方法 
setMaxAge與getMaxAge方法 
setPath與getPath方法 

  • HttpServletResponse介面中定義了一個addCookie方法,它用於在傳送給瀏覽器的HTTP響應訊息中增加一個Set-Cookie響應頭欄位。
  • HttpServletRequest介面中定義了一個getCookies方法,它用於從HTTP請求訊息的Cookie請求頭欄位中讀取所有的Cookie項。

Cookie的傳送 

1.建立Cookie物件
2.設定最大時效
3.將Cookie放入到HTTP響應報頭

  • 如果建立了一個cookie,並將他傳送到瀏覽器,預設情況下它是一個會話級別的cookie; 儲存在瀏覽器的記憶體中,使用者退出瀏覽器之後被刪除。若希望瀏覽器將該cookie儲存在磁碟上,則需要使用maxAge,並給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。
  • 傳送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個 Set-Cookie HTTP響應報頭中。由於這個方法並不修改任何之前指定的Set-Cookie報頭,而是建立新的報頭,因此將這個方法稱為是addCookie,而非setCookie

會話cookie和持久cookie的區別

  • 如果不設定過期時間,則表示這個cookie生命週期為瀏覽器會話期間,只要關閉瀏覽器視窗,cookie就消失了。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不儲存在硬碟上而是儲存在記憶體裡。
  • 如果設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie依然有效直到超過設定的過期時間。
  • 儲存在硬碟上的cookie可以在不同的瀏覽器程序間共享,比如兩個IE視窗。而對於儲存在記憶體的cookie,不同的瀏覽器有不同的處理方式。

Cookie的讀取 

1.呼叫request.getCookies

  • 要獲取瀏覽器傳送來的cookie,需要呼叫HttpServletRequest的getCookies方法,這個呼叫返回Cookie物件的陣列,對應由HTTP請求中Cookie報頭輸入的值。

2.對陣列進行迴圈,呼叫每個cookie的getName方法,直到找到感興趣的cookie為止

 

複製程式碼
//1. 獲取 Cookie
        Cookie [] cookies = request.getCookies();
        if(cookies != null && cookies.length > 0){
            for(Cookie cookie: cookies){
                //2. 獲取 Cookie 的 name 和 value
                out.print(cookie.getName() + ": " + cookie.getValue());
                out.print("<br>"); 
            }
        }else{
            out.print("沒有一個 Cookie, 正在建立並返回");
            //1. 建立一個 Cookie 物件
            Cookie cookie = new Cookie("name", "nchu");
            //setMaxAge: 設定 Cookie 的最大時效, 以秒為單位, 若為 0 , 表示立即刪除該 Cookie
            //若為負數, 表示不儲存該 Cookie, 若為正數, 表示該 Cookie 的儲存在上磁碟的時間. 
            cookie.setMaxAge(30);
            
            //2. 呼叫 response 的一個方法把 Cookie 傳給客戶端. 
            response.addCookie(cookie);
        }
來源:https://www.cnblogs.com/realshijing/p/7868438.html
  • HTTP協議是一種無狀態的協議,WEB伺服器本身不能識別出哪些請求是同一個瀏覽器發出的 ,瀏覽器的每一次請求都是完全孤立的
  • 即使 HTTP1.1 支援持續連線,但當用戶有一段時間沒有提交請求,連線也會關閉。
  • 作為 web 伺服器,必須能夠採用一種機制來唯一地標識一個使用者,同時記錄該使用者的狀態

會話和會話狀態

  • WEB應用中的會話是指一個客戶端瀏覽器與WEB伺服器之間連續發生的一系列請求和響應過程。
  • WEB應用的會話狀態是指WEB伺服器與瀏覽器在會話過程中產生的狀態資訊,藉助會話狀態,WEB伺服器能夠把屬於同一會話中的一系列的請求和響應過程關聯起來。

實現有狀態的會話

  • WEB伺服器端程式要能從大量的請求訊息中區分出哪些請求訊息屬於同一個會話,即能識別出來自同一個瀏覽器的訪問請求,這需要瀏覽器對其發出的每個請求訊息都進行標識:屬於同一個會話中的請求訊息都附帶同樣的標識號,而屬於不同會話的請求訊息總是附帶不同的標識號,這個標識號就稱之為會話ID(SessionID)。
  • 在 Servlet 規範中,常用以下兩種機制完成會話跟蹤

Cookie 
Session

Cookie機制

  • cookie機制採用的是在客戶端保持 HTTP 狀態資訊的方案
  • Cookie是在瀏覽器訪問WEB伺服器的某個資源時,由WEB伺服器在HTTP響應訊息頭中附帶傳送給瀏覽器的一個小文字檔案。
  • 一旦WEB瀏覽器儲存了某個Cookie,那麼它在以後每次訪問該WEB伺服器時,都會在HTTP請求頭中將這個Cookie回傳給WEB伺服器。
  • 底層的實現原理: WEB伺服器通過在HTTP響應訊息中增加Set-Cookie響應頭欄位將Cookie資訊傳送給瀏覽器,瀏覽器則通過在HTTP請求訊息中增加Cookie請求頭欄位將Cookie回傳給WEB伺服器。
  • 一個Cookie只能標識一種資訊,它至少含有一個標識該資訊的名稱(NAME)和設定值(VALUE)。
  • 一個WEB站點可以給一個WEB瀏覽器傳送多個Cookie,一個WEB瀏覽器也可以儲存多個WEB站點提供的Cookie。
  • 瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。

在Servlet程式中使用Cookie 

  • Servlet API中提供了一個javax.servlet.http.Cookie類來封裝Cookie資訊,它包含有生成Cookie資訊和提取Cookie資訊的各個屬性的方法。
  • Cookie類的方法:

構造方法: public Cookie(String name,String value)

getName方法 
setValue與getValue方法 
setMaxAge與getMaxAge方法 
setPath與getPath方法 

  • HttpServletResponse介面中定義了一個addCookie方法,它用於在傳送給瀏覽器的HTTP響應訊息中增加一個Set-Cookie響應頭欄位。
  • HttpServletRequest介面中定義了一個getCookies方法,它用於從HTTP請求訊息的Cookie請求頭欄位中讀取所有的Cookie項。

Cookie的傳送 

1.建立Cookie物件
2.設定最大時效
3.將Cookie放入到HTTP響應報頭

  • 如果建立了一個cookie,並將他傳送到瀏覽器,預設情況下它是一個會話級別的cookie; 儲存在瀏覽器的記憶體中,使用者退出瀏覽器之後被刪除。若希望瀏覽器將該cookie儲存在磁碟上,則需要使用maxAge,並給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。
  • 傳送cookie需要使用HttpServletResponse的addCookie方法,將cookie插入到一個 Set-Cookie HTTP響應報頭中。由於這個方法並不修改任何之前指定的Set-Cookie報頭,而是建立新的報頭,因此將這個方法稱為是addCookie,而非setCookie

會話cookie和持久cookie的區別

  • 如果不設定過期時間,則表示這個cookie生命週期為瀏覽器會話期間,只要關閉瀏覽器視窗,cookie就消失了。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不儲存在硬碟上而是儲存在記憶體裡。
  • 如果設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie依然有效直到超過設定的過期時間。
  • 儲存在硬碟上的cookie可以在不同的瀏覽器程序間共享,比如兩個IE視窗。而對於儲存在記憶體的cookie,不同的瀏覽器有不同的處理方式。

Cookie的讀取 

1.呼叫request.getCookies

  • 要獲取瀏覽器傳送來的cookie,需要呼叫HttpServletRequest的getCookies方法,這個呼叫返回Cookie物件的陣列,對應由HTTP請求中Cookie報頭輸入的值。

2.對陣列進行迴圈,呼叫每個cookie的getName方法,直到找到感興趣的cookie為止

 

複製程式碼
//1. 獲取 Cookie
        Cookie [] cookies = request.getCookies();
        if(cookies != null && cookies.length > 0){
            for(Cookie cookie: cookies){
                //2. 獲取 Cookie 的 name 和 value
                out.print(cookie.getName() + ": " + cookie.getValue());
                out.print("<br>"); 
            }
        }else{
            out.print("沒有一個 Cookie, 正在建立並返回");
            //1. 建立一個 Cookie 物件
            Cookie cookie = new Cookie("name", "nchu");
            //setMaxAge: 設定 Cookie 的最大時效, 以秒為單位, 若為 0 , 表示立即刪除該 Cookie
            //若為負數, 表示不儲存該 Cookie, 若為正數, 表示該 Cookie 的儲存在上磁碟的時間. 
            cookie.setMaxAge(30);
            
            //2. 呼叫 response 的一個方法把 Cookie 傳給客戶端. 
            response.addCookie(cookie);
        }