天天看點

cookie和session機制

一、cookie和session機制之間的差別和聯系

1、cookie機制

cookie意為“甜餅”,是由w3c組織提出,最早由netscape社群發展的一種機制。目前cookie已經成為标準,所有的主流浏覽器如ie、netscape、firefox、opera等都支援cookie。

cookie的含義是“伺服器送給浏覽器的甜點”,即伺服器在響應請求時可以将一些資料以“鍵-值”對的形式通過響應資訊儲存在用戶端。當浏覽器再次通路相同的應用時,會将原先的cookie通過請求資訊帶到伺服器端。

具體來說cookie機制采用的是在用戶端保持狀态的方案。它是在使用者端的會話狀态的存貯機制,他需要使用者打開用戶端的cookie支援。cookie的作用就是為了解決http協定無狀态的缺陷所作的努力。

檢視某個網站頒發的cookie很簡單。在浏覽器位址欄輸入javascript:alert(document. cookie)就可以了(需要有網才能檢視)。

注意:cookie功能需要浏覽器的支援。

如果浏覽器不支援cookie(如大部分手機中的浏覽器)或者把cookie禁用了,cookie功能就會失效。

不同的浏覽器采用不同的方式儲存cookie。

ie浏覽器會在“c:\users\administrator\appdata\roaming\microsoft\windows\cookies”檔案夾下以文本檔案形式儲存,一個文本檔案儲存一個cookie。其中administrator改為自己的電腦名稱。

cookie具有不可跨域名性。根據cookie規範,浏覽器通路google隻會攜帶google的cookie,而不會攜帶baidu的cookie。google也隻能操作google的cookie,而不能操作baidu的cookie。

cookie在用戶端是由浏覽器來管理的。浏覽器能夠保證google隻會操作google的cookie而不會操作 baidu的cookie,進而保證使用者的隐私安全。浏覽器判斷一個網站是否能操作另一個網站cookie的依據是域名。google與baidu的域名不一樣,是以google不能操作baidu的cookie。

需要注意的是,雖然網站images.google.com與網站www.google.com同屬于google,但是域名不一樣,二者同樣不能互相操作彼此的cookie。

注意:使用者登入網站www.google.com之後會發現通路images.google.com時登入資訊仍然有效,而普通的cookie是做不到的。這是因為google做了特殊處理。本章後面也會對cookie做類似的處理。

http協定不僅是無狀态的,而且是不安全的。使用http協定的資料不經過任何加密就直接在網絡上傳播,有被截獲的可能。使用http協定傳輸很機密的内容是一種隐患。如果不希望cookie在http等非安全協定中傳輸,可以設定cookie的secure屬性為true。浏覽器隻會在https和 ssl等安全協定中傳輸此類cookie。

2、session機制

當多個用戶端執行程式時,伺服器會儲存多個用戶端的session。擷取session的時候也不需要聲明擷取誰的session。session機制決定了目前客戶隻會擷取到自己的session,而不會擷取到别人的session。各客戶的session也彼此獨立,互不可見。

而session機制采用的是一種在用戶端與伺服器之間保持狀态的解決方案。同時我們也看到,由于采用伺服器端保持狀态的方案在用戶端也需要儲存一個辨別,是以session機制可能需要借助于cookie機制來達到儲存辨別的目的。而session提供了友善管理全局變量的方式。

session是針對每一個使用者的,變量的值儲存在伺服器上,用一個session id來區分是哪個使用者session變量,這個值是通過使用者的浏覽器在通路的時候傳回給伺服器,當客戶禁用cookie時,這個值也可能設定為由get來傳回給伺服器。

就安全性來說:當你通路一個使用session的站點,同時在自己機子上建立一個cookie,建議在伺服器端的session機制更安全些。因為它不會任意讀取客戶存儲的資訊。

正統的cookie分發是通過擴充http協定來實作的,伺服器通過在http的響應頭中加上一行特殊的訓示以提示浏覽器按照訓示生成相應的cookie。

從網絡伺服器觀點看所有http請求都獨立于先前請求。就是說每一個http響應完全依賴于相應請求中包含的資訊。

狀态管理機制克服了http的一些限制并允許網絡用戶端及伺服器端維護請求間的關系。在這種關系維持的期間叫做會話(session)。

cookies是伺服器在本地機器上存儲的小段文本并随每一個請求發送至同一個伺服器。ietf rfc 2965 http state management mechanism是通用cookie規範。網絡伺服器用http頭向用戶端發送 cookies,在客戶終端,浏覽器解析這些cookies并将它們儲存為一個本地檔案,它會自動将同一伺服器的任何請求縛上這些cookies

二、了解session機制

session機制是一種伺服器端的機制,伺服器使用一種類似于散清單的結構(也可能就是使用散清單)來儲存資訊。

1、session的生命周期

session儲存在伺服器端。為了獲得更高的存取速度,伺服器一般把session放在記憶體裡。每個使用者都會有一個獨立的session。如果session内容過于複雜,當大量客戶通路伺服器時可能會導緻記憶體溢出。是以,session裡的資訊應該盡量精簡。

session在使用者第一次通路伺服器的時候自動建立。需要注意隻有通路jsp、servlet等程式時才會建立session,隻通路html、image等靜态資源并不會建立session。如果尚未生成session,也可以使用request.getsession(true)強制生成session。

session生成後,隻要使用者繼續通路,伺服器就會更新session的最後通路時間,并維護該session。使用者每通路伺服器一次,無論是否讀寫session,伺服器都認為該使用者的session“活躍(active)”了一次。

2、用戶端使用cookie

當程式需要為某個用戶端的請求建立一個session的時候,伺服器首先檢查這個用戶端的請求裡是否已包含了一個session辨別-稱為sessionid,如果已包含一個sessionid則說明以前已經為此用戶端建立過session,伺服器就按照sessionid把這個 session檢索出來使用(如果檢索不到,可能會建立一個),如果用戶端請求不包含sessionid,則為此用戶端建立一個session并且生成一 個與此session相關聯的sessionid,sessionid的值應該是一個既不會重複,又不容易被找到規律以仿造的字元串,這個

sessionid将被在本次響應中傳回給用戶端儲存。

儲存這個sessionid的方式可以采用cookie,這樣在互動過程中浏覽器可以自動的按照規則把這個辨別發揮給伺服器。一般這個 cookie的名字都是類似于seeesionid。比如weblogic對于web應用程式生成的cookie,jsessionid = byok3vjfd75apnrf7c2hmdnv6qzcebzwowibyenlerjq99zwpbng!-145788764,它的名字就是jsessionid。

3、用戶端使用url重寫

由于cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把sessionid傳遞回伺服器。經常被使用的一種技術叫做url重寫,就是把sessionid直接附加在url路徑的後面,附加方式也有兩種,

1)一種是作為url路徑的附加資訊,表現形式為http://...../xxx;jsessionid=byok3vjfd75apnrf7c2hmdnv6qzcebzwowibyenlerjq99zwpbng!-145788764

2)另一種是作為查詢字元串附加在url後面,表現形式為http://...../xxx?jsessionid=byok3vjfd75apnrf7c2hmdnv6qzcebzwowibyenlerjq99zwpbng!-145788764

  這兩種方式對于使用者來說是沒有差別的,隻是伺服器在解析的時候處理的方式不同,采用第一種方式也有利于把sessionid的資訊和正常程式參數區分開來。

注意:tomcat判斷用戶端浏覽器是否支援cookie的依據是請求中是否含有cookie。盡管用戶端可能會支援cookie,但是由于第一次請求時不會攜帶任何cookie(因為并無任何cookie可以攜帶),url位址重寫後的位址中仍然會帶有jsessionid。當第二次通路時伺服器已經在浏覽器中寫入cookie了,是以url位址重寫後的位址中就不會帶有jsessionid了。

三、總結 

為了在整個互動過程中始終保持狀态,就必須在每個用戶端可能請求的路徑後面都包含這個sessionid。

  在談論session機制的時候,常常聽到這樣一種誤解“隻要關閉浏覽器,session就消失了”。其實可以想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易删除顧客的資料。對session來說也是一樣的,除非程式通知伺服器删除一個session,否則伺服器會一直保留,程式一般都是在使用者做logoff的時候發個指令去删除session。然而浏覽器從來不會主動在關閉之前通知伺服器它将要關閉,是以伺服器根本不會有機會知道浏覽器已經關閉,之是以會有這種錯覺,是大部分session機制都使用會話cookie來儲存sessionid,而關閉浏覽器後這個

sessionid就消失了,再次連接配接伺服器時也就無法找到原來的session。如果伺服器設定的cookie被儲存到硬碟上,或者使用某種手段改寫浏覽器發出的http請求頭,把原來的sessionid發送給伺服器,則再次打開浏覽器仍然能夠找到原來的session。

恰恰是由于關閉浏覽器不會導緻session被删除,迫使伺服器為seesion設定了一個失效時間,當距離用戶端上一次使用session的時間超過這個失效時間時,伺服器就可以認為用戶端已經停止了活動,才會把session删除以節省存儲空間。

參考之:

http://blog.csdn.net/fangaoxin/article/details/6952954

繼續閱讀