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

Tomcat中session的管理機(jī)制

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

詳細(xì)描述Tomcat中session的管理機(jī)制:

1. 請(qǐng)求過(guò)程中的session操作:

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

(1)SessionId解析過(guò)程時(shí)序圖:


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

下面貼出關(guān)鍵代碼:

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


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

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


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

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

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

下面貼出關(guān)鍵代碼:

類RequestFacade的getSession方法:


類Request的getSession方法:


類Request的doGetSession方法:



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

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

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

2. Session的管理機(jī)制

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

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


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

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

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

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

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

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

(6)ClusterManager:實(shí)現(xiàn)了Manager接口,通過(guò)類名應(yīng)該能猜到,這個(gè)就是管理集群session的管理器和上面那個(gè)StandardManager單機(jī)版的session管理器是相對(duì)的概念。這個(gè)類定義類集群間session的復(fù)制共享接口。

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

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

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

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


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


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

3. Tomcat session相關(guān)的配置

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


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


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


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

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


還有一點(diǎn)就是sessionId默認(rèn)指定的長(zhǎng)度是16個(gè)字節(jié),這個(gè)在SessionIdGenerator當(dāng)中指定:


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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java同步代碼塊和同步方法原理與應(yīng)用案例詳解

    Java同步代碼塊和同步方法原理與應(yīng)用案例詳解

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

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

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

    SpringBoot之核心依賴和自動(dòng)配置方式

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

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

    今天給大家?guī)?lái)的文章是如何實(shí)現(xiàn)SpringBoot的底層注解,文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴很有幫助,需要的朋友可以參考下
    2021-06-06
  • IDEA初次配置并導(dǎo)入gite碼云的方法

    IDEA初次配置并導(dǎo)入gite碼云的方法

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

    Java中的ThreadLocal與ThreadLocalMap詳解

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

    java中類和對(duì)象的知識(shí)點(diǎn)總結(jié)

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

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

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

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

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

    mysql高版本(8.0+)group_by報(bào)錯(cuò)的處理方法

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

最新評(píng)論