cookie、session、sessionid 與jsessionid

cookie、session、sessionid 與jsessionid

2012-08-14 00:04 by 蟲師, 40762 閱讀, 13 評論, 收藏編輯

 

  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個印花之後,就可以免費獲得一杯奶茶。這樣子,印花的信息是保存在客戶的積分卡上,你如果不懷好意的話,就自己搞幾個神似的印花去騙奶茶喝吧。哈哈,這樣子是不是更符合在客戶端端保持狀態。而拿銀行卡去銀行取錢,我們的卡只需要保存一個卡號,更多的信息是保存在服務器中,這樣也比較符合服務器端保持狀態。希望能幫到你。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章