http協議是無狀態的,但是很多應用需要伺服器掌握用戶端的狀態,比如網上購物,這時cookie和session就發揮了它們的作用
cookie和session的區別和聯絡
cookie機制採用的是在用戶端保持狀態的方案,而session機制採用的是在伺服器保持狀態的方案,可是採用伺服器端保持狀態的方案在用戶端也要儲存一個標識,所以session機制可能需要藉助於cookie機制以達到儲存標識的目的,但實際上它還有其他選擇
cookie機制
cookie分發是通過擴充http協議來實現的,伺服器通過在http的回應標頭加上一行特殊的指示以提示瀏覽器按照指示產生相應的cookie,但是有一點要注意一下。純粹的用戶端指令碼比如javascript或者vbscript也可以產生cookie,所以在安全方面存在隱患。
cookie的使用是由瀏覽器按照一定的原則在後台自動發送給伺服器的。瀏覽器檢查所有的cookie,如果這個cookie所聲明的作用範圍大於將要請求的資源所在的位置,則把cookie附在請求資源的http頭部上發送給伺服器
cookie的內容主要包括:名字,值,到期時間,路徑和域,路徑和域一起構成cookie的作用範圍,如果不設定到期時間,則表示這個cookie的生命週期為瀏覽器會話期間,關閉瀏覽器視窗,cookie就消失。這種生命週期為會話期的cookie被稱為會話cookie,會話cookie一般不儲存在硬碟上,而是儲存在記憶體中。如果設定了到期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie仍然有效,直到超過設定的到期時間,儲存在硬碟上的cookie可以在不同的瀏覽器進程共用
session機制
在WEB開發中,伺服器可以為每個使用者瀏覽器建立一個會話對象(session對象),注意:一個瀏覽器獨佔一個session對象(預設情況下)。因此,在需要儲存使用者資料時,伺服器程式可以把使用者資料寫到使用者瀏覽器獨佔的session中,當使用者使用瀏覽器訪問其它程式時,其它程式可以從使用者的session中取出該使用者的資料,為使用者服務。
session是一種伺服器端的機制,伺服器使用一種類似於散列表的結構來儲存資訊當程式需要為某個用戶端的請求建立session時,伺服器首先檢查這個用戶端的請求裡是否已包含了一個session標識(稱sessionid)。
如果已包含則說明以前已經為此用戶端建立過session,伺服器就按照session id把這個session檢索出來使用,如果檢索不到,就會建立一個。
如果用戶端請求不包含session id,則為此用戶端建立一個session並且產生一個與此session相關聯的session id,session id的值應該是一個唯一且無規律,不容易偽造的字串,這個session id會在被本次響應中返回給用戶端儲存。
儲存這個session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發送給伺服器。一般這個cookie的名字都是類似於SESSIONID,但cookie可以被人為的禁止,所以必須有其他機制以便於在禁止cookie的情況下仍然能夠把session id發送給伺服器
經常使用的一種技術叫做URL重寫,就是把session id直接附加到URL路徑的後面。還有一種技術叫做表單隱藏欄位。就是伺服器會自動修改表單,添加一個隱藏欄位,以便於在表單提交時能夠把session id發送給伺服器,比如:
<form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> <input type="text"> </form>
綜上所述,區別可以總結為以下內容
cookie資料存放在客戶的瀏覽器上,session資料存放在伺服器上
cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,所以將登陸資訊等重要訊息存放在session中比較好,其他資訊如果需要保留,可以存放在cookie中
session會在一定時間內儲存在伺服器上,當訪問增多,會比較佔用伺服器效能
單個cookie儲存的資料不能超過4k,很多瀏覽器都限制一個網站最多儲存20個cookie
http協議是無狀態的,但是很多應用需要伺服器掌握用戶端的狀態,比如網上購物,這時cookie和session就發揮了它們的作用