理解session機制和cookie機制

2022-08-03 19:42:17 字數 3349 閱讀 4832

乙個形象的例子

關於session和cookie的介紹,看過了很多,感覺下面的例子是我看過最形象、最容易理解的乙個(感謝原作者):

讓我們用乙個例子來描述一下cookie和session機制之間的區別與聯絡。筆者曾經常去的一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案: 

1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種做法就是協議本身支援狀態。 

2、發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯絡起來。這種做法就是在客戶端保持狀態。 

3、發給顧客一張會員卡,除了卡號之外什麼資訊也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄新增一些消費資訊。這種做法就是在伺服器端保持狀態。 

由於http協議是無狀態的,而出於種種考慮也不希望使之成為有狀態的,因此,後面兩種方案就成為現實的選擇。具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存乙個標識,所以session機制可能需要借助於cookie機制來達到儲存標識的目的,但實際上它還有其他選擇。 

理解cookie機制

cookie分發:是由伺服器通過在http的響應頭中加上一行特殊的指示【set cookie】以提示瀏覽器按照指示生成相應的cookie。

cookie使用:是由瀏覽器按照一定的原則在後台自動傳送給伺服器的。瀏覽器檢查所有儲存的cookie,如果某個cookie所宣告的作用範圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的http請求頭上傳送給伺服器。

cookie的內容主要包括:名字,值,過期時間,路徑和域。

路徑就是跟在網域名稱後面的url路徑。路徑與域合在一起就構成了cookie的作用範圍。

如果不設定過期時間,則表示這個cookie的生命期為瀏覽器會話期間,只要關閉瀏覽器視窗,cookie就消失了。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不儲存在硬碟上而是儲存在記憶體裡,當然這種行為並不是規範規定的。

如果設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie仍然有效直到超過設定的過期時間。 

儲存在硬碟上的cookie可以在不同的瀏覽器程序間共享,比如兩個ie視窗。而對於儲存在記憶體裡的cookie,不同的瀏覽器有不同的處理方式。

理解session機制

session機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表的結構(也可能就是使用雜湊表)來儲存資訊。 

當程式需要為某個客戶端的請求建立乙個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了乙個session標識 - 稱為session id,如果已包含乙個session id則說明以前已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建乙個),如果客戶端請求不包含session id,則為此客戶端建立乙個session並且生成乙個與此session相關聯的session id,session id的值應該是乙個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次響應中返回給客戶端儲存。 

儲存這個session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發回給伺服器。

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

另一種技術叫做表單隱藏字段。就是伺服器會自動修改表單,新增乙個隱藏字段,以便在表單提交時能夠把session id傳遞歸伺服器。

在談論session機制的時候,常常聽到這樣一種誤解「只要關閉瀏覽器,session就消失了」。其實可以想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程式通知伺服器刪除乙個session,否則伺服器會一直保留,程式一般都是在使用者做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來儲存session id,而關閉瀏覽器後這個session id就消失了,再次連線伺服器時也就無法找到原來的session。如果伺服器設定的cookie被儲存到硬碟上,或者使用某種手段改寫瀏覽器發出的http請求頭,把原來的session id傳送給伺服器,則再次開啟瀏覽器仍然能夠找到原來的session。 

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

一般情況下,session都是儲存在記憶體裡,當伺服器程序被停止或者重啟的時候,記憶體裡的session也會被清空,如果設定了session的持久化特性,伺服器就會把session儲存到硬碟上,當伺服器程序重新啟動或這些資訊將能夠被再次使用。

httpsession 常見問題:

1、session在何時被建立 

乙個常見的誤解是以為session在有客戶端訪問時就被建立,然而事實是直到某server端程式呼叫httpservletrequest.getsession(true)這樣的語句時才被建立,注意如果jsp沒有顯示的使用 <%@page session="false"%> 關閉session,則jsp檔案在編譯成servlet時將會自動加上這樣一條語句httpsession session = httpservletrequest.getsession(true);這也是jsp中隱含的session物件的來歷。 

由於session會消耗記憶體資源,因此,如果不打算使用session,應該在所有的jsp中關閉它。 

8、如何防止使用者開啟兩個瀏覽器視窗操作導致的session混亂

這個問題與防止表單多次提交(是類似的,可以通過設定客戶端的令牌來解決。就是在伺服器每次生成乙個不同的id返回給客戶端,同時儲存在session裡,客戶端提交表單時必須把這個id也返回伺服器,程式首先比較返回的id與儲存在session裡的值是否一致,如果不一致則說明本次操作已經被提交過了。

cookie機制和session機制

一 cookie機制和session機制的區別 具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於才伺服器端保持狀態的方案在客戶端也需要儲存乙個標識,所以session 機制可能需要借助於cookie機制來達到儲存標識的...

Cookie機制和Session機制

1.cookie 1.cookie 是在http協議下,伺服器或指令碼可以維護客戶工作站上資訊的一種方式。cookie 是由 web伺服器儲存在使用者瀏覽器 客戶端 上的小文字檔案 內容通常經過加密 它可以包含有關使用者的資訊。無論何時使用者鏈結到伺服器,web站點都可以訪問cookie 資訊,可以...

深入理解session過期機制

首先得明白 session的過期時間由兩方面決定的 1儲存在客戶端的 cookie phpsessid 的過期時間 預設cookie名稱為phpsessid,可通過php.ini中的session.name修改。2.儲存在伺服器端的相對應的session檔案 session檔名和上述cookie的值...