1. 程式人生 > >【蟲師--系列10】cookie、session、sessionid 與jsessionid

【蟲師--系列10】cookie、session、sessionid 與jsessionid

轉自:http://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html    作者:蟲師

cookie、session、sessionid 與jsessionid,要想明白他們之間的關係,下面來看個有趣的場景來幫你理解。

  我們都知道銀行,銀行的收櫃檯每天要接待客戶存款/取款業務,可以有幾種方案:

  憑藉櫃檯職員的記憶,由收櫃檯職員來為每位顧客辦理存款/取款業務,單憑職員的記憶力,要記到每位顧客的相貌,並迅速這個顧客當前的存款以及存取的次數,每次存取的金額是多少。-----------這種方式表示協議本身支援狀態。

     使用存摺的方式,然後櫃檯職員就把每個顧客的存款/

取款的資訊儲存在這張摺子,然後交給顧客保管,當顧客來存款/取款時,只要拿出存摺,職員檢視存摺就對當前這位顧客的存款/取款資訊一目瞭然。當然,你馬上會想到,顧客修改這個資訊怎麼辦?我們也有措施對每次存款/取款記錄後面蓋章。無蓋章的就是假冒資訊。但如果顧客是真的要偽造,當然印章也是可以偽造的。-------------這種方式就是在客戶端端保持狀態。

     使用銀行卡的方式,發給每位銀行使用者一張銀行卡,銀行卡上有一個唯一的卡號,沒有其它任何資訊,當顧客來存款/取款時,拿出銀行卡,銀行把卡號輸入的電腦,很快就顯示當前使用者的存/取款記錄。這種方式的安全性就會有很大的提高。使用者想要手腳只有攻破銀行的伺服器來修改自己的存/取款資訊,這樣做難度會很大。

---------這種方式就是伺服器端保持狀態。

Cookie session的產生過程                                

  我們都知道HTTP協議本身是無狀態的,客戶只需要簡單的向伺服器來發送請求下載某些檔案,客戶端向伺服器端傳送的每次請求都是獨立的。對於當前的web應用,HTTP的“無狀態”,導致許多應用都不得不花費大量的精力來記錄使用者的操作步驟。就像我們上面介紹的第一種情況,銀行職員要花費大量的精力來記憶每一位使用者的存/取款記錄。

  程式設計師很快發現,如果能夠提供一些按需生成的動太資訊,會使web的互動能力大大增強。程式設計師一方面在HTML

中新增表單、指令碼、DOM等客戶端行為,來增加web應用與客戶端的互動性。另一方面在伺服器端測出現了CGI規範以響應客戶端的動態請求,作為傳輸載體的HTTP協議添加了檔案上載、cookie 等特性。那cookie的原理與我們上面介紹的使用存摺記錄使用者應為的方式是一樣一樣的。

  通過前面的例子我們已經發現,通過cookie的方式儲存資訊,可能會存在一點定的安全性,因為所有的資訊都是寫在客戶端的,客戶可能會對這些資訊進行修改或清除。然後就又出現session的方式用於儲存使用者行為,這種方式的原理與前面介紹銀行卡的方式是一樣的。

  具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制可能需要藉助於cookie機制來達到儲存標識的目的,但實際上它還有其他選擇。

cookie與session的機制與原理                                                                 

   cookie機制。正統的cookie分發是通過擴充套件HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端指令碼如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由瀏覽器按照一定的原則在後臺自動傳送給伺服器的。瀏覽器檢查所有儲存的cookie,如果某個cookie所宣告的作用範圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上傳送給伺服器。


     cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用範圍。若不設定過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器視窗,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不儲存在硬碟上而是儲存在記憶體裡,當然這種行為並不是規範規定的。若設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie仍然有效直到超過設定的過期時間。儲存在硬碟上的cookie可以在不同的瀏覽器程序間共享,比如兩個IE視窗。而對於儲存在記憶體裡的cookie,不同的瀏覽器有不同的處理方式。 

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

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


        儲存這個session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發揮給伺服器。一般這個cookie的名字都是類似於SEEESIONID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞迴伺服器。
       經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面。還有一種技術叫做表單隱藏欄位。就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把session id傳遞迴伺服器。

Jsessionid?

  Jsessionid只是tomcat的對sessionid的叫法,其實就是sessionid;在其它的容器也許就不叫jsessionid了。

-------------------最新更新--------

 Terry_Huang  回覆: 

  給你舉個更生動的例子,以前大學的時候,經常去大卡司去喝奶茶,每喝一杯,都可以得到一個印花(第一次喝的時候他會給你個積分卡片),集齊6個印花之後,就可以免費獲得一杯奶茶。這樣子,印花的資訊是儲存在客戶的積分卡上,你如果不懷好意的話,就自己搞幾個神似的印花去騙奶茶喝吧。哈哈,這樣子是不是更符合在客戶端端保持狀態。而拿銀行卡去銀行取錢,我們的卡只需要儲存一個卡號,更多的資訊是儲存在伺服器中,這樣也比較符合伺服器端保持狀態。希望能幫到你。

    可能是我的描述不夠貼切,積分卡和存摺是類似的,使用者的存取資訊是儲存在存摺上的,存摺又是在客戶手裡(客戶端)可能現在很少有人用存摺了,或存摺已經被銀行取消掉了。