天天看點

Cookie與Session的認識與了解

一.引入這兩種技術的原因

因為HTTP是無狀态的協定,無法根據之前的狀态繼續處理後續的請求。也就是說在HTTP下,伺服器無法分辨誰已經浏覽過了某一網頁,對于使用者登入的情況,因為該協定無法記錄登入狀态,是以會導緻每次跳轉新的頁面需要再次登入或者在每次的請求封包中添加參數來管理登陸狀态。

雖然這種無狀态的協定能夠有效減少伺服器cpu與記憶體的消耗,但是在某些情況下是非常不利于使用者操作的,是以,為了能夠讓伺服器記住使用者的登陸狀态以及了解使用者購物車添加了哪些商品,先後出現了四種技術,分别是隐藏表單域、URL重寫、cookie、session。

本文主要讨論的技術是cookie、session。

二者應用場景:

登入網站,今輸入使用者名密碼登入了,第二天再打開很多情況下就直接打開了。這個時候用到的一個機制就是cookie。

購物車,添加了商品之後用戶端處可以知道添加了哪些商品,而伺服器端如何判别呢,是以也需要存儲一些資訊就用到了session。

二.Cookie

Cookie通俗講,是通路某些網站後在本地存儲的一些網站相關資訊,下次通路時減少一些步驟。更準确的說法是:Cookies是伺服器在本地機器上存儲的小段文本并随每一個請求發送至同一伺服器,是在用戶端保持狀态的方案。

<1>Cookie的處理流程:

  • 伺服器向用戶端發送cookie
  • 浏覽器将cookie儲存
  • 之後每次http請求浏覽器都會将cookie發送給伺服器端

<2>組成部分

Cookie的主要内容包括:名字,值,過期時間,路徑和域。使用Fiddler抓包就可以看見。

  1. name:一個唯一确定的cookie名稱。通常來講cookie的名稱是不區分大小寫的。
  2. value:存儲在cookie中的字元串值。最好為cookie的name和value進行url編碼
  3. domain:cookie對于哪個域是有效的。所有向該域發送的請求中都會包含這個cookie資訊。這個值可以包含子域(如:yq.aliyun.com),也可以不包含它(如:.aliyun.com,則對于aliyun.com的所有子域都有效).
  4. path: 表示這個cookie影響到的路徑,浏覽器跟會根據這項配置,像指定域中比對的路徑發送cookie。
  5. expires:失效時間,表示cookie何時應該被删除的時間戳(也就是,何時應該停止向伺服器發送這個cookie)。如果不設定這個時間戳,浏覽器會在頁面關閉時即将删除所有cookie;不過也可以自己設定删除時間。這個值是GMT時間格式,如果用戶端和伺服器端時間不一緻,使用expires就會存在偏差。
  6. max-age: 與expires作用相同,用來告訴浏覽器此cookie多久過期(機關是秒),而不是一個固定的時間點。正常情況下,max-age的優先級高于expires。
  7. HttpOnly: 告知浏覽器不允許通過腳本document.cookie去更改這個值,同樣這個值在document.cookie中也不可見。但在http請求張仍然會攜帶這個cookie。注意這個值雖然在腳本中不可擷取,但仍然在浏覽器安裝目錄中以檔案形式存在。這項設定通常在伺服器端設定。
  8. secure: 安全标志,指定後,隻有在使用SSL連結時候才能發送到伺服器,如果是http連結則不會傳遞該資訊。就算設定了secure 屬性也并不代表他人不能看到你機器本地儲存的 cookie 資訊,是以不要把重要資訊放cookie就對了

<3>浏覽器程序間共享cookie

存儲在硬碟上的cookie可以在不同的浏覽器程序間共享,比如兩個IE視窗。

而對于儲存在記憶體裡的cookie,不同的浏覽器有不同的處理方式。對于IE,在一個打開的視窗上按Ctrl-N(或者從檔案菜單)打開的視窗可以與原視窗共享,而使用其他方式新開的IE程序則不能共享已經打開的視窗的記憶體cookie;對于Mozilla Firefox0.8,所有的程序和标簽頁都可以共享同樣的cookie。一般來說是用javascript的window.open打開的視窗會與原視窗共享記憶體cookie。浏覽器對于會話cookie的這種隻認cookie不認人的處理方式經常給采用session機制的web應用程式開發者造成很大的困擾。

三.Session

Session存在伺服器的一種用來存放使用者資料的類HashTable結構。

浏覽器第一次發送請求時,伺服器自動生成了一HashTable和一Session ID來唯一辨別這個HashTable,并将其通過響應發送到浏覽器。浏覽器第二次發送請求會将前一次伺服器響應中的Session ID放在請求中一并發送到伺服器上,伺服器從請求中提取出Session ID,并和儲存的所有Session ID進行對比,找到這個使用者對應的HashTable。

一般這個值會有個時間限制,逾時後毀掉這個值,預設30分鐘。

當使用者在應用程式的 Web頁間跳轉時,存儲在 Session 對象中的變量不會丢失而是在整個使用者會話中一直存在下去。

Session的實作方式和Cookie有一定關系。建立一個連接配接就生成一個session id,打開幾個頁面就好幾個了,這裡就用到了Cookie,把session id存在Cookie中,每次通路的時候将Session id帶過去就可以識别了.

四.Cookie與Session差別

<1>存儲資料量方面:

session 能夠存儲任意的 java 對象,cookie 隻能存儲 String 類型的對象,且單個cookie儲存的資料不能超過4K,很多浏覽器都限制一個站點最多儲存20個cookie。

<2>存儲位置:

cookie存儲在用戶端,session存儲在服務端。因Cookie在用戶端是以可以編輯僞造,不是十分安全。

<3>資源限制:

Session過多時會消耗伺服器資源,大型網站會有專門Session伺服器,Cookie存在用戶端沒問題。

<4>支援範圍:

域的支援範圍不一樣,比方說a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解決這個問題的辦法是JSONP或者跨域資源共享。