cookie與session

maqianmaqian發表於2010-09-08

web應用中,我們所有的操作全部是瀏覽器,而瀏覽器和伺服器之間採用的是http協議,而這種協議是 無狀態的,所以這導致伺服器無法知道是誰操作瀏覽器,但有一些操作是需要使用者的狀態。

為了解決這一問題,先後出現了四種技術,分別是隱藏表單域、URL重寫,cookie,session,專案中使用最多的則是cookie和seesion。

  • cookie

cookie是瀏覽器儲存在使用者電腦上的一小段文字(有大小和數量顯示的),通俗來說就是當一個使用者通過http訪問伺服器是,伺服器會將一些key/value鍵值對返回給客戶端瀏覽器,並且在這些資料加上一些限制條件,在條件符合時這個使用者在 下次訪問這個伺服器是,資料通過請求頭又被完整的帶回伺服器,伺服器根據這些資訊來判斷不同的使用者.

  • cookie的建立

當前Cookie有兩個版本,分別對應兩種設定響應頭:“Set-Cookie”和“Set-Cookie2”。在Servlet中並不支援Set-Cookie2,所以我們來看看Set-Cookie的屬性項:

cookie與session

  • cookie的分類
  1. 回話級別cookie

所謂會話級別Cookie,就是在瀏覽器關閉之後Cookie就會失效。

  2. 持久級別cookie

儲存在硬碟的Cookie,只要設定了過期時間就是硬碟級別Cookie。

  • session

session基於cookie來工作的,同一個客戶端每次訪問伺服器是,只要當瀏覽器 在第一次訪問伺服器是,伺服器設定一個id並儲存一些資訊,並且把這個id通過cookie村咋客戶端,客戶端每次和伺服器互動式只傳遞id,就可以實現維持瀏覽器和伺服器的狀態,而這個id通常是name為JSESSIOND的一個cookie。

  • session和cookie

有四種方式讓session正常工作

  1. 通過url傳遞sessionID
  2. 通過cookie傳遞SessionID
  3. 通過SSL傳遞SessionID
  4. 通過隱藏表單傳遞SessionID
  • 建立Session

客戶端訪問伺服器時,伺服器為這個客戶端通過request.getSession()方法建立一個session。如果當前SeeionID還沒有對應的HttpSession物件,將建立一個新的,並新增到org.apache.catalina.Manager的session容器中儲存,這就做到了對應狀態的保持。

  • session儲存

session物件已經儲存在了Manager類中,StandardManager作為實現類,通過requestedSessionId從StandardManager的sessions集合中取出StandardSession物件。

當Servlet容器關閉:

StandardManager將持久化沒過期的StandardSession物件(必須呼叫Servlet容器中的stop和start命令,不能直接kill)


當Servlet容器重啟時:

StandardManager初始化會重讀這個檔案,解析出所有session物件。

  • session的銷燬

這裡有一個誤區,也是我之前的錯誤理解,就是我將session的生命週期理解成一次會話,瀏覽器開啟就建立,瀏覽器關閉就銷燬,這樣理解是錯的!!

session的宣告週期是從建立到超時過期

也就是說,當session建立後,瀏覽器關閉,會話級別的Cookie被銷燬,如果沒有超過設定時間,該SessionID對應的session是沒有被銷燬的

檢查session失效

檢查每個Session是否失效是在Tomcat的一個後臺執行緒完成的(backgroundProcess()方法中);除了後臺程式檢驗session是否失效外,呼叫request.getSession()也會檢查該session是否過期,當然,呼叫這種方法如果過期的話又會重新建立一個新的session。


相關文章