Javaweb Cookie機制

Javaweb Cookie機制

1、前言

  HTTP協議是一種無狀態的協議,WEB服務器自己不能識別出哪些請求是同一個瀏覽器發出的 ,瀏覽器的每一次請求都是徹底孤立的,即便 HTTP1.1 支持持續鏈接,但當用戶有一段時間沒有提交請求,鏈接也會關閉。java

  怎麼才能實現網上商店中的購物車呢:某個用戶從網站的登陸頁面登入後,再進入購物頁面購物時,負責處理購物請求的服務器程序必須知道處理上一次請求的程序所獲得的用戶信息。 web

  做爲 web 服務器,必須可以採用一種機制來惟一地標識一個用戶,同時記錄該用戶的狀態。這就是本文要說的Javaweb cookie機制。數組

2、會話和會話狀態

  WEB應用中的會話是指一個客戶端瀏覽器與WEB服務器之間連續發生的一系列請求和響應過程。瀏覽器

  WEB應用的會話狀態是指WEB服務器與瀏覽器在會話過程當中產生的狀態信息,藉助會話狀態,WEB服務器可以把屬於同一會話中的一系列的請求和響應過程關聯起來。 服務器

  如何實現有狀態的會話?

  WEB服務器端程序要能從大量的請求消息中區分出哪些請求消息屬於同一個會話,即能識別出來自同一個瀏覽器的訪問請求,這須要瀏覽器對其發出的每一個請求消息都進行標識:屬於同一個會話中的請求消息都附帶一樣的標識號,而屬於不一樣會話的請求消息老是附帶不一樣的標識號,這個標識號就稱之爲會話ID(SessionID)。
  在 Servlet 規範中,經常使用如下兩種機制完成會話跟蹤:Cookie和Session。 cookie

  本文主要討論Cookie機制,Session機制你們可瞭解個人下一篇博文。學習

3、Cookie機制

  Cookie機制採用的是在客戶端保持 HTTP 狀態信息的方案。網站

  Cookie是在瀏覽器訪問WEB服務器的某個資源時,由WEB服務器在HTTP響應消息頭中附帶傳送給瀏覽器的一個小文本文件。 ui

  一旦WEB瀏覽器保存了某個Cookie,那麼它在之後每次訪問該WEB服務器時,都會在HTTP請求頭中將這個Cookie回傳給WEB服務器。url

  底層的實現原理: WEB服務器經過在HTTP響應消息中增長Set-Cookie響應頭字段將Cookie信息發送給瀏覽器,瀏覽器則經過在HTTP請求消息中增長Cookie請求頭字段將Cookie回傳給WEB服務器。

  一個Cookie只能標識一種信息,它至少含有一個標識該信息的名稱(NAME)和設置值(VALUE)。

  一個WEB站點能夠給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也能夠存儲多個WEB站點提供的Cookie。

  瀏覽器通常只容許存放300個Cookie,每一個站點最多存放20個Cookie,每一個Cookie的大小限制爲4KB。

Cookie傳送過程示意圖

4、在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項。

5、cookie的發送

  1.建立Cookie對象

  2.設置最大時效

  3.將Cookie放入到HTTP響應報頭

  若是建立了一個cookie,並將他發送到瀏覽器,默認狀況下它是一個會話級別的cookie; 存儲在瀏覽器的內存中,用戶退出瀏覽器以後被刪除。若但願瀏覽器將該cookie存儲在磁盤上,則須要使用maxAge,並給出一個以秒爲單位的時間。將最大時效設爲0則是命令瀏覽器刪除該cookie。

  發送cookie須要使用HttpServletResponse的addCookie方法,將cookie插入到一個 Set-Cookie HTTP響應報頭中。因爲這個方法並不修改任何以前指定的Set-Cookie報頭,而是建立新的報頭,所以將這個方法稱爲是addCookie,而非setCookie。

6、會話cookie和持久cookie的區別

  若是不設置過時時間,則表示這個cookie生命週期爲瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。這種生命期爲瀏覽器會話期的cookie被稱爲會話cookie。會話cookie通常不保存在硬盤上而是保存在內存裏。

  若是設置了過時時間,瀏覽器就會把cookie保存到硬盤上,關閉後再次打開瀏覽器,這些cookie依然有效直到超過設定的過時時間。

  存儲在硬盤上的cookie能夠在不一樣的瀏覽器進程間共享,好比兩個IE窗口。而對於保存在內存的cookie,不一樣的瀏覽器有不一樣的處理方式。

7、cookie的讀取

  1.調用request.getCookies
  要獲取瀏覽器發送來的cookie,須要調用HttpServletRequest的getCookies方法,這個調用返回Cookie對象的數組,對應由HTTP請求中Cookie報頭輸入的值。

  2.對數組進行循環,調用每一個cookie的getName方法,直到找到感興趣的cookie爲止

8、跟蹤用戶上次訪問站點的時間

  功能:幫助網站實現提示客戶端計算機上次訪問網站的時間

  實現原理:將每個會話做爲一次訪問過程,將每次會話的開始時間做爲每次訪問網站的時間,而後將這個時間以Cookie的形式存儲到客戶端的計算機中,客戶端進行下次訪問時經過該Cookie回傳上次訪問站點的時間值。

  爲了讓Cookie信息在客戶端瀏覽器或計算機關閉後仍然保持存在,Cookie的保存時間被設置爲了一年。

若是,您對個人這篇博文有什麼疑問,歡迎評論區留言,你們互相討論學習。
若是,您認爲閱讀這篇博客讓您有些收穫,不妨點擊一下右下角的【推薦】。
若是,您但願更容易地發現個人新博客,不妨點擊一下左下角的【關注我】。
若是,您對個人博文感興趣,能夠關注個人後續博客,我是【AlbertRui】。

轉載請註明出處和連接地址,歡迎轉載,謝謝!

相關文章
相關標籤/搜索