精品免费在线观看-精品欧美-精品欧美成人bd高清在线观看-精品欧美高清不卡在线-精品欧美日韩一区二区

17站長網(wǎng)

17站長網(wǎng) 首頁 網(wǎng)站 服務(wù)器 查看內(nèi)容

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

2022-9-29 15:21| 查看: 1584 |來源: 互聯(lián)網(wǎng)

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

前言

偶然發(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<>();

當一個請求到達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;


本文最后更新于 2022-9-29 15:21,某些文章具有時效性,若有錯誤或已失效,請在網(wǎng)站留言或聯(lián)系站長:17tui@17tui.com
·END·
站長網(wǎng)微信號:w17tui,關(guān)注站長、創(chuàng)業(yè)、關(guān)注互聯(lián)網(wǎng)人 - 互聯(lián)網(wǎng)創(chuàng)業(yè)者營銷服務(wù)中心

免責聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識,文章和圖片版權(quán)歸原作者及原出處所有,僅供學習與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系我們及時修正或刪除。謝謝!

17站長網(wǎng)微信二維碼

始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉(zhuǎn)型升級,為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營銷服務(wù),與站長一起進步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨!

掃一掃,關(guān)注站長網(wǎng)微信

大家都在看

熱門排行

    最近更新

      返回頂部
      主站蜘蛛池模板: 日本国产最新一区二区三区 | 国产国语毛片 | 久热香蕉精品视频在线播放 | 日鲁夜鲁天天鲁视频 | 99精选视频 | 手机看片欧美 | 亚洲精品国产成人99久久 | 日本午夜一级特黄毛片 | 欧美一区二区三区在线观看免费 | 在线看欧美日韩中文字幕 | 国产a级三级三级三级中国 国产a级午夜毛片 | 欧美日韩无线在码不卡一区二区三区 | 国产免费一区二区三区 | 国产欧美精品国产国产专区 | 日本精品视频一区二区三区 | 午夜国产福利视频一区 | 东莞a级毛片 | 国产一级视频在线观看 | 精品午夜视频 | 在线观看免费视频国产 | 久久精品国产精品亚洲精品 | 亚洲国产成人久久综合野外 | 真人毛片免费拍拍拍aa视频 | 国产精品页| 日韩欧美一级大片 | 国产成人精品视频一区二区不卡 | 久久ri精品高清一区二区三区 | 久久99热狠狠色一区二区 | 六月丁香婷婷色狠狠久久 | xzl仙踪林一区 | 亚洲小视频在线观看 | 日韩美女人体视频免费播放 | 免费观看黄色在线视频 | 一级毛片一级黄片 | 欧美精品午夜毛片免费看 | 黄色影院免费观看 | 亚洲午夜高清 | 亚洲欧美另类精品久久久 | 国产视频97| 国产亚洲美女精品久久久久狼 | 欧美视频一区二区专区 |