Web容器的會話機制

基本全部web應用開發的朋友都很熟悉session會話這個概念,在某個特定時間內,咱們說能夠在一個會話中存儲某些狀態,須要的時候又能夠把狀態取出來,這整個過程的時間空間能夠抽象成「會話」這個概念。html

儘管你對session的使用已經很熟悉了,但你未必真正理解session是什麼。由於你可能只是使用了request.getsession().setAttribute("users", username)把某個值設置到會話中的users變量裏面,只是使用了String username = (String)request.getsession().getAttribute("users")獲取會話中users變量的值,對於裏面具體作了哪些操做、實現機制是如何的可能比較模糊。而這裏將對符合Java規範的web容器的會話機制作一個簡單大概的描述。web

關於web容器的會話運行機制能夠根據上圖幫助理解,某個客戶端向WebContainer發起請求,http請求報文的cookie頭部攜帶了會話標識jsessionid(假設使用tomcat,會話標識取爲jsessionid,其餘服務器可能參數名稱不叫jsessionid),在咱們的WebContainer中,假如已經寫好了一個servlet專門用於處理此請求 ,若是要設置某個值到會話中則使用request.getsession().setAttribute(「key」,val),執行此語句具體作了哪些操做呢?瀏覽器

首先getsession方法其實就是根據jsessionid從web容器的會話集中查找屬於此客戶端的會話對象,數據結構如上圖的下半部分所示,例如客戶端傳的值爲jsessionid1,則找到對應的會話session1。
其次是調用獲取到的會話session的setAttribute方法,它實際上是往會話中保存數據,session1包含了一個kv結構用於存放數據,因此其實就是把鍵值放到kv結構中。
最後若是要獲取會話的值則使用request.getsession().getAttribute(「key」),若是已經搞懂了會話的設置則很好理解,先根據jsessionid獲取session對象,再根據key獲取session對象裏面的kv集對應的值。tomcat

另外,客戶端是如何把jsessionid傳遞到服務端的呢?通常會有三種方式,服務器

  1. cookie方式,即經過瀏覽器讀取小文本cookie,讀取jsessionid值後附加到http協議的cookie頭部,http協議報文傳輸到服務端後解析cookie頭部即可以獲取,但若是你把瀏覽器的cookie給禁止了則這種方式會失效。
  2. 重寫url方式,即把jsessionid附加到請求的url中,例如www.tomcat.com/index.jsp?j…
  3. 表單隱藏方式,這種方式其實相似重寫url方式,咱們把jsessionid及其值存放在html表單中,提交時就會一塊兒被提交,服務端只要根據post或get方法分別解析即可獲取到。

Web容器的會話機制補充了http協議的無狀態性,使web在應用功能方面更增強大,知足了更多更復雜的需求。無論是web應用層開發人員仍是中間件開發人員深刻理解session機制在軟件設計時都會有很大的幫助。cookie

========廣告時間========session

鄙人的新書《Tomcat內核設計剖析》已經在京東銷售了,有須要的朋友能夠到 item.jd.com/12185360.ht… 進行預約。感謝各位朋友。數據結構

=========================
歡迎關注:
jsp

這裏寫圖片描述
這裏寫圖片描述
相關文章
相關標籤/搜索