在使用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繪制)和筆記