Java Web之Cookie和Session的理解

YungFan發表於2017-12-13

Cookie和Session.jpg

日常現象

  • 登入了某個網站,過一會兒再登入,誒,不用輸入密碼了,直接是登入狀態了,好神奇~~~
  • 在某網站看了一部手機,接下來瀏覽其他網站,旁邊的廣告全是手機和類似資訊,好恐怖~~~
  • 瀏覽某網站時,提示我是第66666位訪問的客戶,真的假的?

其實這些都是Cookie和Session在後面作祟,下面就帶大家學習學習這兩個東東。

Cookie和Session的異同

  • Cookie與Session都是用來儲存使用者狀態資訊的一種方法或者手段;
  • Cookie是儲存在客戶端的臨時資料夾, Session是儲存在伺服器的記憶體中的,伺服器使用一種類似於雜湊表的結構來儲存資訊,一個Session域物件為一個客戶瀏覽器服務;
  • Cookie安全性較差,Session安全性較高;
  • Cookie的儲存時間可以很久(以txt格式儲存在客戶端硬碟),Session儲存的時間很短,一般是30分鐘;
  • Cookie為多個客戶瀏覽器共享,Session為一個客戶瀏覽器獨享;
  • Session是通過Cookie的機制來實現的。

兩個經典問題與URL重寫

1、客戶端禁用Cookie,問Session還能工作嗎?

  • 不能(事實)絕大多數的網站是這樣,原因是沒有使用URL重寫機制來解決Cookie被禁用的問題。(URL重寫程式碼量大而且只能應用在動態的頁面靜態的不行)
  • 能(事實)微乎其微的網站可以(比如:卓越),原因是它使用了URL重寫機制。

2、 Cookie可以用來實現購物車功能嗎? 能,Session能做的Cookie也能做。

** 本質 ** 無論Cookie,還是URL重寫,目的都是向伺服器傳遞JSESSIONID=32位字串的key和value名值對。

理解Cookie-Session機制

當程式需要為某個客戶端的請求建立一個Session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個Session標識——稱為 Session id,如果已包含一個Session id則說明以前已經為此客戶端建立過Session,伺服器就按照Session id把這個 Session檢索出來使用。如果客戶端請求不包含Session id,則為此客戶端建立一個Session並且生成一個與此Session相關聯的Session id,這個 Session id將在本次響應中返回給客戶端儲存。客戶端儲存這個Session id的方式可以採用Cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發回給伺服器。一般這個Cookie的名字都是類似於JSESSIONID。對Session來說,除非應用程式通知伺服器刪除一個Session,否則伺服器會一直保留它。瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器不會知道瀏覽器已經關閉。之所以會有這種錯覺,是大部分Session機制都使用會話Cookie來儲存Session id,而關閉瀏覽器後這個 Session id就消失了,再次連線伺服器時也就無法找到原來的Session。如果伺服器設定的Cookie被儲存到硬碟上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的Session id傳送給伺服器,則再次開啟瀏覽器仍然能夠找到原來的Session。也就實說關閉瀏覽器不會導致伺服器端Session被刪除,但是大量的Session一直在也伺服器記憶體,伺服器也受不了,所以伺服器為Session設定了一個失效時間,當距離客戶端上一次使用Session的時間超過這個失效時間(一般為30分鐘)時,伺服器就可以認為客戶端已經停止了活動,才會把Session刪除以節省伺服器端的儲存空間。

相關文章