How Tomcat works — 八、tomcat中的session管理


在使用shiro的session的時候感覺對於tomcat中session的管理還不是特別清楚,而且session管理作為tomcat中比較重要的一部分還是很有必要學習的。

目錄

  • 概述
  • session的作用
  • session新建、查找和更新
  • session刪除
  • 總結

概述

在tomcatsession管理的類標准實現為StandardManager,主要作用為啟動的是加載緩存的session,類關系如下:

在用戶servlet中使用的session為StandardSessionFacade(也是使用了facade模式,類似request),類關系如下:

session的作用

因為http協議是無狀態的,但是在實際使用中我們需要知道上次請求保存在服務器端的數據,這個時候就用到了session,結合客戶端的cookie就可以實現暫時在服務器端存儲部分數據。但是注意,cookie並不是僅僅為了配合session而存在,cookie主要用來客戶端來存儲一些數據。和普通cookie不一樣的地方是,和session相關的cookie 是由服務器端返回給瀏覽器,由瀏覽器自動設置的,不需要開發人員參與。

session新建、查找和更新

session新建

因為在一次請求中session不是必要的,所以tomcat 不是一定會創建session,只有在使用到了才會創建新的session,比如在UserServlet中使用到了session,創建過程如下:

非紅框圈住的部分是session新建的過程,在request.addSessionIdInternal方法中將session作為cokkie設置到response頭信息中,瀏覽器中收到"set-cookie"頭信息的時候會將該頭信息的值設置到cookie中,下次請求的時候會帶上。

session查找

當同一個客戶端在有效時間內(默認是30分鍾,也是session的默認過期時間)第二次請求來了的時候,在CoyoteAdapter.postParseRequest方法內解析request請求頭信息獲取cookie(如果有的話),然后將cookie作為sessionId(其實cookie就是sessionId)設置到request對象中,在servlet 中調用getSession的時候,如果根據該sessionId查找到了session,則不會新建,否則才會新建。

調用過程如上圖中左上方的紅框。

session更新

因為session有過期時間,tomcat會記錄該session的lastAccessedTime,更新session也就是更新這個時間,調用過程如上圖中最下面的紅框。

session刪除

默認session是有過期時間,而且保存在內存中的,如果,一直不刪除session,最后肯定會撐爆內存,在tomcat 中刪除session的情況有兩種:

  • 在新的請求來的時候,如果查找到對應的session了會驗證session是否可用(過期),如果過期了就會刪除該session
  • 在daemon線程(ContainerBase$ContainerBackgroundProcessor.processChildren中StandardContext->ContainerBase.backgroundProcess中調用StandardManager->ManagerBase.backgroundProcess)中定時檢查是否過期,如果 過期則刪除。

總結

到這里tomcat源碼閱讀基本上已經完成,大體脈絡已經很明確,收獲頗多,第一次閱讀源碼確實感覺到了一個好的開源項目的強大之處。

 


 

這段時間來的圖(使用astah繪制)和筆記

http://pan.baidu.com/s/1dF2sGpj


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM