最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Tomcat如何監(jiān)控并刪除超時Session詳解

 更新時間:2019年04月16日 08:31:42   作者:貓毛·波拿巴  
這篇文章主要給大家介紹了關(guān)于Tomcat如何監(jiān)控并刪除超時Session的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Tomcat具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

偶然發(fā)現(xiàn)Tomcat會話時間的半小時,并不是說會話創(chuàng)建后,只有半小時的有效使用時間,而是說會話空閑半小時后,會被刪除。索性就翻了一下源碼。做了一番整理。

注:空閑時間,指的是同一個會話兩次請求之間的間隔時間

Session相關(guān)類圖


  • HttpSession就是大家Servlet層可以直接使用的Session.
  • Session是Tomcat內(nèi)部使用的接口,可以做一些內(nèi)部調(diào)用
  • StandardSession是標準的HttpSession實現(xiàn),同時它也實現(xiàn)了Session接口,用于Tomcat內(nèi)部管理
  • StandardSessionFacade,類名已經(jīng)指明它就是一個“門面類”,它內(nèi)部會引用一個StandardSession的對象,但對外只提供HttpSession規(guī)定的方法。

Manager相關(guān)類圖


StandardManager與PersitentManager都是Manager的實現(xiàn),但是它們在存儲Session對象的方式上有所不同。

StandarManager

1.Tomcat運行時,把Session存儲在內(nèi)存中

2.Tomcat關(guān)閉時(注意是正常的關(guān)閉操作,而非突然崩潰),會把Session寫入到磁盤中,等到Tomcat重啟后再把Session加載進來

PersistentManager

1.總是把Session存儲在磁盤中。

Manager與Context的關(guān)系

在Tomcat中,一個Context就是部署到Tomcat中的一個應(yīng)用(Webapp)。每一個Context都有一個單獨的Manager對象來管理這個應(yīng)用的會話信息。

Manager如何存儲Session

Manager對象會使用一個Map來存儲Session對象

  • Key  => SessionId
  • Value  => Session Object
 /**
  * The set of currently active Sessions for this Manager, keyed by
  * session identifier.
  */
 protected Map<String, Session> sessions = new ConcurrentHashMap<>();

當(dāng)一個請求到達Context的時候,如果它帶有JSESSIONID的Cookie,Manager就能依此找到關(guān)聯(lián)的Session對象,放入到Request對象中。

Manager的定期檢查

Manager接口有一個backgroundProcess()方法,顧名思義就是后臺處理。

/**
  * This method will be invoked by the context/container on a periodic
  * basis and allows the manager to implement
  * a method that executes periodic tasks, such as expiring sessions etc.
  */
 public void backgroundProcess();

注:Container接口也有這個方法,這個方法一般在容器啟動(start)的時候,開啟一個額外的線程來執(zhí)行這個backgroundProcess方法。其中Context的這個方法啟動后,會執(zhí)行Loader和Manager的backgroundProcess方法。

我們來看看這個方法都做了些什么?

/**
 * {@inheritDoc}
 * <p>
 * Direct call to {@link #processExpires()}
 */
@Override
public void backgroundProcess() {
 count = (count + 1) % processExpiresFrequency;
 if (count == 0) //如果達到檢查頻率則開始檢查
  processExpires();
}

/**
 * Invalidate all sessions that have expired.
 */
public void processExpires() {

 long timeNow = System.currentTimeMillis();
 Session sessions[] = findSessions(); //獲取所有session對象
 int expireHere = 0 ; //過期session的數(shù)量,不要被這個變量名騙了

 if(log.isDebugEnabled())
  log.debug("Start expire sessions " + getName() + " at " + timeNow + " sessioncount " + sessions.length);
 for (int i = 0; i < sessions.length; i++) {
  if (sessions[i]!=null && !sessions[i].isValid()) {
   expireHere++;
  }
 }
 long timeEnd = System.currentTimeMillis();
 if(log.isDebugEnabled()) //打印記錄
   log.debug("End expire sessions " + getName() + " processingTime " + (timeEnd - timeNow) + " expired sessions: " + expireHere);
 processingTime += ( timeEnd - timeNow );

}

很多人看到這里,可能會有跟我一樣的疑惑,即這里面根本就沒有使Session過期失效的操作,好像只做了狀態(tài)檢查。不過后來看到了Session的isValid方法的實現(xiàn)就都明白了。

/**
 * Return the <code>isValid</code> flag for this session.
 */
@Override
public boolean isValid() {

 if (!this.isValid) {
  return false;
 }

 if (this.expiring) {
  return true;
 }

 if (ACTIVITY_CHECK && accessCount.get() > 0) {
  return true;
 }

 //關(guān)鍵所在
 //如果有設(shè)置最大空閑時間
 //就獲取此Session的空閑時間進行判斷
 //如果已超時,則執(zhí)行expire操作
 if (maxInactiveInterval > 0) { 
  int timeIdle = (int) (getIdleTimeInternal() / 1000L);
  if (timeIdle >= maxInactiveInterval) {
   expire(true);
  }
 }

 return this.isValid;
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • tomcat管道模式 pipeline與valve詳解

    tomcat管道模式 pipeline與valve詳解

    這篇文章主要介紹了tomcat管道模式 pipeline與valve詳解,管道模式就像一條管道把多個對象連接起來,整體看起來就像若干個閥門嵌套在管道中,而處理邏輯就放在閥門上,需要的朋友可以參考下
    2019-07-07
  • Tomcat修正JDK原生線程池bug的實現(xiàn)原理

    Tomcat修正JDK原生線程池bug的實現(xiàn)原理

    這篇文章主要介紹了Tomcat是如何修正JDK原生線程池bug的,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Tomcat進程假死問題排查

    Tomcat進程假死問題排查

    本文主要介紹了Tomcat進程假死問題排查,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 對一個tomcat實現(xiàn)多端口、多域名訪問的方法

    對一個tomcat實現(xiàn)多端口、多域名訪問的方法

    這篇文章主要是介紹如何在tomcat中進行配置,使同一個應(yīng)用可以通過不同的端口號進行訪問。大家可能都遇到過,在某些需要進行安全控制的場景中會應(yīng)用到,例如:不同地址段只能通過某個端口訪問。下面通過這篇文章來詳細學(xué)習(xí)下吧,有需要的可以參考借鑒。
    2016-11-11
  • Tomcat下載安裝并部署到IDEA的教程(附帶idea兩種熱部署設(shè)置方法)

    Tomcat下載安裝并部署到IDEA的教程(附帶idea兩種熱部署設(shè)置方法)

    這篇文章主要介紹了Tomcat下載安裝并部署到IDEA的教程(附帶idea兩種熱部署設(shè)置方法),本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • linux系統(tǒng)中修改tomcat默認輸入日志路徑的方法

    linux系統(tǒng)中修改tomcat默認輸入日志路徑的方法

    本文給大家介紹了linux系統(tǒng)中修改tomcat默認輸入日志路徑的方法,文中只是給大家介紹linux系統(tǒng)修改默認logs的方法,windows系統(tǒng)類似,需要的朋友可以參考下
    2018-03-03
  • 使用IntelliJ IDEA配置Tomcat入門教程

    使用IntelliJ IDEA配置Tomcat入門教程

    這篇文章主要介紹了使用IntelliJ IDEA配置Tomcat入門教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Linux下定時切割Tomcat日志并刪除指定天數(shù)前的日志記錄

    Linux下定時切割Tomcat日志并刪除指定天數(shù)前的日志記錄

    這篇文章主要介紹了Linux下定時切割Tomcat日志并刪除指定天數(shù)前的日志記錄,需要的朋友可以參考下
    2017-08-08
  • 詳解tomcat熱部署和熱加載的方法

    詳解tomcat熱部署和熱加載的方法

    這篇文章主要介紹了詳解tomcat熱部署和熱加載的方法的相關(guān)資料,這里提供兩種tomcat熱部署和熱加載的方法,需要的朋友可以參考下
    2017-08-08
  • 一次tomcat自動關(guān)閉的bug解決

    一次tomcat自動關(guān)閉的bug解決

    這篇文章主要給大家介紹了一次關(guān)于tomcat自動關(guān)閉的bug的解決過程,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用tomcat具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

新乡市| 海林市| 枣阳市| 遵义市| 亚东县| 红河县| 华宁县| 巨野县| 土默特左旗| 永春县| 梁山县| 鲁甸县| 冷水江市| 建湖县| 堆龙德庆县| 临江市| 福泉市| 富锦市| 乐平市| 镇安县| 宜兴市| 大庆市| 遂川县| 贵州省| 桃江县| 庆城县| 沁源县| 交口县| 陇西县| 宾川县| 永州市| 新昌县| 西贡区| 西华县| 金寨县| 三明市| 新疆| 静安区| 和硕县| 崇阳县| 临江市|