欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Tomcat中session的管理機制

 更新時間:2016年09月24日 10:07:43   作者:銳洋智能  
這篇文章主要為大家詳細介紹了Tomcat中session的管理機制 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下

詳細描述Tomcat中session的管理機制:

1. 請求過程中的session操作:

簡述:在請求過程中首先要解析請求中的sessionId信息,然后將sessionId存儲到request的參數(shù)列表中。然后再從 request獲取session的時候,如果存在sessionId那么就根據(jù)Id從session池中獲取session,如果sessionId不 存在或者session失效,那么則新建session并且將session信息放入session池,供下次使用。

(1)SessionId解析過程時序圖:


概述:首先用戶發(fā)送一個http請求傳遞給Http11Processor,經(jīng)由Http11Processor解析封裝在org.apache.coyote.Request然后傳遞給CoyoteAdapter,coyoteAdapter是一個適配器,將coyote框架封裝的org.apache.coyote.Request適配給org.apache.catalina.connector.Request(這個流程不多說,之前都有總結(jié)過),轉(zhuǎn)換完之后會調(diào)用parsePathParameters方法去解析路徑參數(shù)中的cookie信息(因為當cookie被瀏覽器禁用時,會將cookie信息重寫進url),先嘗試從url中嘗試解析出sessionId. 然后會調(diào)用parseSessionCookiesId,這個就是從cookie中解析sessionId存到request(parsePathParameters和parseSessionCookiesId方法,在調(diào)用過程中,沒有看到明顯的異或邏輯,即兩者都執(zhí)行了,但這樣不是就有問題了嗎?想想其實沒有問題的,URL重寫設置sessionId或者放到cookie中傳遞過來,兩者方式只會用一個,想到這點就知道沒有問題了)解析到sessionId就放到了request里面。解析SessionId的邏輯就ok了。

下面貼出關鍵代碼:

ParsePathParameters方法(從重寫URL中解析):


Ps: 標記出來的部分分別是從URL解析出變量,然后放到request參數(shù)列表里面。

parseSessionCookiesId方法(從cookie中解析出sessionId):


Ps: 上面的標記就是從cookie中獲取sessionId.看第一個標記有個SessionConfig.getSessionCookieName(context)的調(diào)用,這里會獲取到一個默認的sessionId的key,這個key是定義在SessionConfig中的,其值為jsessionId:

(2) 從請求中獲取session的流程基本就是上文描述的這樣。那么再看一下Servlet獲取session的流程:

概述:appServlet是我們自己定義的一個Servlet,在通過Reqest獲取session的時候,其實調(diào)用的這個HttpServletRequest(是一個接口)其實是RequestFacade(封裝了org.apache.catalina.connector.Request的一個門面),然后RequestFacade會調(diào)用真實的Request的getSession方法。Request具體的邏輯是調(diào)用Context容器的getManger方法獲取Session管理器(session管理器詳情下文介紹),然后如果SessionId如果已經(jīng)被解析出來了,那么則會調(diào)用findSession方法從session對象池中獲取對應的session,反之如果sessionId不存在,則需要重新創(chuàng)建一個Session,并放入session對象池中。

下面貼出關鍵代碼:

類RequestFacade的getSession方法:


類Request的getSession方法:


類Request的doGetSession方法:



Ps:第一個標記就是根據(jù)SessionId從session對象池中獲取session信息,第二標記就是在沒有解析到sessionId的情況下創(chuàng)建一個新的Session對象。

這個創(chuàng)建一個新的session這里點涉及到新的sessionId的生成,生成sessionId的邏輯關鍵代碼是在類SessionIdGenerator中的generateSessionId方法中定義:

以上即是Servlet獲取session的流程,下文具體總結(jié)一下tomcat是怎么來管理Session的,即session管理器的知識。

2. Session的管理機制

Session管理器定義:Session管理器組件負責管理Session對象,例如,創(chuàng)建和銷毀Session對象。

首先看一張Session管理器的類繼承結(jié)構(gòu)圖(這個是tocmat7.x的圖,tomcat5的類繼承機構(gòu)和這個有很大不同):


簡述:下面依次總結(jié)下每個類(參考官網(wǎng)信息):

(1)Manager:定義了關聯(lián)到某一個容器的用來管理session池的基本接口。

(2)ManagerBase:實現(xiàn)了Manager接口,該類提供了Session管理器的常見功能的實現(xiàn)。

(3)StandardManager:繼承自ManagerBase,tomcat的默認Session管理器(不指定配置,默認使用這個),是tomcat處理session的非集群實現(xiàn)(也就說是單機版的),tomcat關閉時,內(nèi)存session信息會持久化到磁盤保存為SESSION.ser,再次啟動時恢復。

(4)PersistentManagerBase:繼承自ManagerBase,實現(xiàn)了和定義了session管理器持久化的基礎功能。

(5)PersistentManager:繼承自PersistentManagerBase,主要實現(xiàn)的功能是會把空閑的會話對象(通過設定超時時間)交換到磁盤上。

(6)ClusterManager:實現(xiàn)了Manager接口,通過類名應該能猜到,這個就是管理集群session的管理器和上面那個StandardManager單機版的session管理器是相對的概念。這個類定義類集群間session的復制共享接口。

(7)ClusterManagerBase:實現(xiàn)了ClusterManager接口,繼承自ManagerBase。該類實現(xiàn)了session復制的基本操作。

(8)BackupManager:繼承自ClusterManagerBase, 集群間session復制策略的一種實現(xiàn),會話數(shù)據(jù)只有一個備份節(jié)點,這個備份節(jié)點的位置集群中所有節(jié)點都可見。這種設計使它有個優(yōu)勢就是支持異構(gòu)部署。

(9)DeltaManager:繼承自ClusterManagerBase,集群建session復制策略的一種實現(xiàn),和BackupManager不同的是,會話數(shù)據(jù)會復制到集群中所有的成員節(jié)點,這也就要求集群中所有節(jié)點必須同構(gòu),必須部署相同的應用。

補充:下面再具體總結(jié)一點就是在PersistentManagerBase類中有個成員變量Store:


持久化session管理器的存儲策略就是有這個Store對象定義的,這個Store的類繼承結(jié)構(gòu)如下:


簡述:接口Store及其實例是為session管理器提供了一套存儲策略,store定義了基本的接口,而StoreBase提供了基本的實現(xiàn)。其中FileStore類實現(xiàn)的策略是將session存儲在以setDirectory()指定目錄并以.session結(jié)尾的文件中的。JDBCStore類是將Session通過JDBC存入數(shù)據(jù)庫中,因此需要使用JDBCStore,需要分別調(diào)用setDriverName()方法和setConnectionURL()方法來設置驅(qū)動程序名稱和連接URL。

3. Tomcat session相關的配置

從兩個層面總結(jié)一下session相關的配置和設置。首先是從配置文件層面,session是有過期時間的,這個默認的過期時間是在$catalina_home/conf/web.xml有定義的。具體的默認配置如下(默認的過期時間是30min,即30min沒有訪問,session就過期了):


還有一點就是session管理如果不配置就默認使用StandardManager,但如果要配置的話可以在$catalina_home/conf/context.xml當中指定(其中從這個配置當中可以看到session管理器是和context容器關聯(lián)的,也就說每個web應用都會有一個session管理器)具體的配置如下:


Tomcat7.x默認這個manager的配置是注釋掉的。如果要指定的PersistentManager為默認管理器的話可以這么指定:


其實看到這也就發(fā)現(xiàn)了,其實session管理器或者Store存儲策略,只要實現(xiàn)了相關的接口,都是可以自定義的。自己寫一個配置在這里就ok了。

另外在從代碼層面總結(jié)一下:session的一些配置信息是寫死在代碼里的,比如SessionConfig這個類就定義了一些session的設置信息。Session在cookie中的名字是JSESSION. Session通過URL重寫的方式放在path里時,鍵值的名字是jsessionids,具體的代碼如下:


還有一點就是sessionId默認指定的長度是16個字節(jié),這個在SessionIdGenerator當中指定:


好了,有關默認配置的就先總結(jié)這么多。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java同步代碼塊和同步方法原理與應用案例詳解

    Java同步代碼塊和同步方法原理與應用案例詳解

    這篇文章主要介紹了Java同步代碼塊和同步方法原理與應用,結(jié)合具體案例形式分析了使用java同步代碼塊和同步方法實現(xiàn)買票功能的相關原理與操作技巧,需要的朋友可以參考下
    2019-10-10
  • SpringBoot?調(diào)用外部接口的三種實現(xiàn)方法

    SpringBoot?調(diào)用外部接口的三種實現(xiàn)方法

    Spring Boot調(diào)用外部接口的方式有多種,常見的有以下三種方式:RestTemplate、Feign 和 WebClient,本文就詳細介紹一下,感興趣的可以了解一下
    2023-08-08
  • SpringBoot之核心依賴和自動配置方式

    SpringBoot之核心依賴和自動配置方式

    這篇文章主要介紹了SpringBoot之核心依賴和自動配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 詳解如何實現(xiàn)SpringBoot的底層注解

    詳解如何實現(xiàn)SpringBoot的底層注解

    今天給大家?guī)淼奈恼率侨绾螌崿F(xiàn)SpringBoot的底層注解,文中有非常詳細的介紹及代碼示例,對正在學習java的小伙伴很有幫助,需要的朋友可以參考下
    2021-06-06
  • IDEA初次配置并導入gite碼云的方法

    IDEA初次配置并導入gite碼云的方法

    這篇文章主要介紹了IDEA初次配置并導入gite碼云的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Java中的ThreadLocal與ThreadLocalMap詳解

    Java中的ThreadLocal與ThreadLocalMap詳解

    這篇文章主要介紹了Java中的ThreadLocal與ThreadLocalMap詳解,ThreadLocal 是一個線程局部變量,其實的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的副本,是Java中一種較為特殊的線程綁定機制,需要的朋友可以參考下
    2023-09-09
  • java中類和對象的知識點總結(jié)

    java中類和對象的知識點總結(jié)

    在本篇文章里小編給大家整理了一篇關于java中類和對象的知識點總結(jié),有需要的朋友們可以學習下。
    2020-12-12
  • springboot 監(jiān)控管理模塊搭建的方法

    springboot 監(jiān)控管理模塊搭建的方法

    本篇文章主要介紹了springboot 監(jiān)控管理模塊搭建的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java中的List接口實現(xiàn)類解析

    Java中的List接口實現(xiàn)類解析

    這篇文章主要介紹了Java中的List接口實現(xiàn)類解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • mysql高版本(8.0+)group_by報錯的處理方法

    mysql高版本(8.0+)group_by報錯的處理方法

    本文主要介紹了mysql高版本(8.0+)group_by報錯的處理方法,這個錯誤一般發(fā)生在mysql 5.7以及 5.7以上的版本中,本文就來介紹一下兩種解決方法,感興趣的可以了解一下
    2023-09-09

最新評論