cookie、session、sessionid 與jsessionid之間的關系


舉個栗子

以銀行收櫃台的存款/取款業務為例

可以有幾種方案:

>憑借記憶

  憑借櫃台職員的記憶,由收櫃台職員來為每位顧客辦理存款/取款業務,單憑職員的記憶力,要記到每位顧客的相貌,並迅速這個顧客當前的存款以及存取的次數,每次存取的金額是多少。
  

-----------這種方式表示協議本身支持狀態。

> 憑借存折

使用存折的方式,然后櫃台職員就把每個顧客的存款/取款的信息保存在這張折子,然后交給顧客保管,當顧客來存款/取款時,只要拿出存折,職員查看存折就對當前這位顧客的存款/取款信息一目了然。當然,你馬上會想到,顧客修改這個信息怎么辦?我們也有措施對每次存款/取款記錄后面蓋章。無蓋章的就是假冒信息。但如果顧客是真的要偽造,當然印章也是可以偽造的。

-------------這種方式就是在客戶端保持狀態。

> 憑借銀行卡

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

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

無狀態的HTTP

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

引入cookie,客戶端按需生成動態信息

  程序員很快發現,如果能夠提供一些按需生成的動態信息,會使web的交互能力大大增強。程序員一方面在HTML中添加表單、腳本、DOM等客戶端行為,來增加web應用與客戶端的交互性。另一方面在服務器端測出現了CGI規范以響應客戶端的動態請求,作為傳輸載體的HTTP協議添加了文件上載、cookie 等特性。那cookie的原理就對應於上面介紹的憑借存折記錄用戶應為的方式。

cookie的引入存在安全性問題,session的出現來保護用戶行為

  通過前面的例子我們已經發現,通過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標識(稱為sessionid),如果已包含則說明以前已經為此客戶端創建過session,服務器就按照sessionid把這個session檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含sessionid,則為此客戶端創建一個session並且生成一個與此session相關聯的sessionid,sessionid的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個sessionid將被在本次響應中返回給客戶端保存。

保存這個sessionid的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發送給服務器。一般這個cookie的名字都是類似於Ssessionid。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把sessionid傳遞回服務器。

經常被使用的一種技術叫做URL重寫,就是把sessionid直接附加在URL路徑的后面。還有一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把sessionid傳遞回服務器。

Jsessionid?

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

【引用】
https://www.cnblogs.com/caiwenjing/p/8081391.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM