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

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

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

前言

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

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

Session相關類圖


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

Manager相關類圖


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

StandarManager

1.Tomcat運行時,把Session存儲在內存中

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

PersistentManager

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

Manager與Context的關系

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

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<>();

當一個請求到達Context的時候,如果它帶有JSESSIONID的Cookie,Manager就能依此找到關聯(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;
 }

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

 return this.isValid;
}

總結

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

相關文章

  • 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的,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Tomcat進程假死問題排查

    Tomcat進程假死問題排查

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

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

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

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

    這篇文章主要介紹了Tomcat下載安裝并部署到IDEA的教程(附帶idea兩種熱部署設置方法),本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    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熱部署和熱加載的方法的相關資料,這里提供兩種tomcat熱部署和熱加載的方法,需要的朋友可以參考下
    2017-08-08
  • 一次tomcat自動關閉的bug解決

    一次tomcat自動關閉的bug解決

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

最新評論

黄石市| 商丘市| 内乡县| 江孜县| 南阳市| 同江市| 长乐市| 原平市| 横峰县| 基隆市| 苍南县| 邛崃市| 婺源县| 安岳县| 隆回县| 石林| 浦县| 玉林市| 乐业县| 沐川县| 甘谷县| 炉霍县| 芷江| 宜川县| 开封县| 武宁县| 荣昌县| 台中市| 灵山县| 盐边县| 沾化县| 连平县| 得荣县| 南充市| 岳阳县| 冀州市| 尉氏县| 梁河县| 东台市| 蒙自县| 正宁县|