JAVAEE_Servlet_24_HttpSession實現原理

失晝發表於2021-04-24

關於JavaWeb中的HttpSession (一)

* Session表示會話,不止存在於JavaWeb之中,只要是Web開發都會存在這種機制

* Session包:javax.servlet.http.HttpSession 簡稱Session會話

* Cookie可以將會話狀態儲存在瀏覽器客戶端,而Session可以將會話儲存在伺服器端

* Session物件是使用者會話級別的物件, 每一個使用者訪問伺服器都會建立一個獨一無二的Session物件, 而該Session物件會被Tomcat伺服器進行維護,只要是同一個使用者向伺服器傳送請求,無論請求多少次,那麼都會訪問同一個Session物件。

* Session物件一個使用者一個,一百個使用者一百個,A來訪問伺服器就儲存A的Session會話狀態,B來訪問就儲存下來B的Session會話狀態。


*  什麼是一次會話?
    
     - 多數情況下:使用者開啟瀏覽器,在瀏覽器上傳送多次請求,直到關閉瀏覽器,表示一次完整的會話,一次會話包括多次請求。

     -  本質上: 從Session物件建立, 到session物件超時, 到Session物件銷燬。是一次完整的會話。

         - Httpsession物件是一個會話級別的物件,一次會話對應一個新的HttpSession物件。

     - 在會話進行過程中,web伺服器一直為當前使用者維護著同一個HtpSession物件。



* 為什麼使用者的每一次請求都可以拿到屬於自己的會話物件而不會獲取到別的使用者的呢 ? Session的實現原理?

    - 在Web容器中,伺服器維護著大量的HttpSession物件,也就是說在Web容器中存在著一個Session列表。

    - Session列表中存放著 <key , Session> 其中key是一個自動生成的Cookie物件的value值部分,Cookie中存放著<"JSESSIONID","32位字串編碼"> JSESSIONID是一個自動生成的具有全球唯一性的32位字串編碼,該編碼值指向當前使用者的Session 
      物件和當前使用者的Session物件進行繫結。

        例如:Session列表儲存著: <CookieValue, Session>


     1. 開啟瀏覽器,在瀏覽器上首次傳送請求訪問一個伺服器,伺服器會自動建立一個HttpSession物件,該物件代表一次會話。

     2. 伺服器建立HttpSession物件的同時會自動生成一個與之對應的Cookie物件,該Cookie物件的name是JSESSIONID,Cookie的value是是32位長度的字串,具有全球唯一性。

           例如:  Cookie cookie = new Cookie("JSESSIONID","32位字串");

     3. 伺服器將該Cookie物件的value值和HttpSession物件繫結在一起,儲存在Session列表中。
      
     4. 伺服器將該Cookie物件傳送給伺服器,並繫結伺服器的根路徑,儲存在瀏覽器的快取中。

     5. 那麼自此以後瀏覽器的每次向該伺服器傳送請求都會向該伺服器提交該Cookie,伺服器接收到Cookie,驗證該Cookie物件的name是JSESSIONID,就會根據Cookie的value值去Session列表中檢索與之對應的Session物件。

     6. 而因為該cookie物件儲存在瀏覽器的快取中,所以只要瀏覽器關閉該Cookie物件就失效了。

     7. 關閉瀏覽器以後再重新開啟瀏覽器,再次訪問該伺服器,因為此時瀏覽器快取中的Cookie物件已經失效,所以不能再向伺服器提交JSESSIONID Cookie,那麼伺服器就會為該瀏覽器建立一個新的HttpSession物件,並生成一個新的Cookie物件,再次傳送 
        給瀏覽器,儲存在瀏覽器的快取中