基本全部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傳遞到服務端的呢?通常會有三種方式,服務器
Web容器的會話機制補充了http協議的無狀態性,使web在應用功能方面更增強大,知足了更多更復雜的需求。無論是web應用層開發人員仍是中間件開發人員深刻理解session機制在軟件設計時都會有很大的幫助。cookie
========廣告時間========session
鄙人的新書《Tomcat內核設計剖析》已經在京東銷售了,有須要的朋友能夠到 item.jd.com/12185360.ht… 進行預約。感謝各位朋友。數據結構
=========================
歡迎關注:
jsp