web應用中,我們所有的操作全部是瀏覽器,而瀏覽器和伺服器之間採用的是http協議,而這種協議是 無狀態的,所以這導致伺服器無法知道是誰操作瀏覽器,但有一些操作是需要使用者的狀態。
為了解決這一問題,先後出現了四種技術,分別是隱藏表單域、URL重寫,cookie,session,專案中使用最多的則是cookie和seesion。
- cookie
cookie是瀏覽器儲存在使用者電腦上的一小段文字(有大小和數量顯示的),通俗來說就是當一個使用者通過http訪問伺服器是,伺服器會將一些key/value鍵值對返回給客戶端瀏覽器,並且在這些資料加上一些限制條件,在條件符合時這個使用者在 下次訪問這個伺服器是,資料通過請求頭又被完整的帶回伺服器,伺服器根據這些資訊來判斷不同的使用者.
- cookie的建立
當前Cookie有兩個版本,分別對應兩種設定響應頭:“Set-Cookie”和“Set-Cookie2”。在Servlet中並不支援Set-Cookie2,所以我們來看看Set-Cookie的屬性項:
- cookie的分類
- 回話級別cookie
所謂會話級別Cookie,就是在瀏覽器關閉之後Cookie就會失效。
2. 持久級別cookie
儲存在硬碟的Cookie,只要設定了過期時間就是硬碟級別Cookie。
- session
session基於cookie來工作的,同一個客戶端每次訪問伺服器是,只要當瀏覽器 在第一次訪問伺服器是,伺服器設定一個id並儲存一些資訊,並且把這個id通過cookie村咋客戶端,客戶端每次和伺服器互動式只傳遞id,就可以實現維持瀏覽器和伺服器的狀態,而這個id通常是name為JSESSIOND的一個cookie。
- session和cookie
有四種方式讓session正常工作
- 通過url傳遞sessionID
- 通過cookie傳遞SessionID
- 通過SSL傳遞SessionID
- 通過隱藏表單傳遞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。