真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Tomcat怎么監(jiān)控并刪除超時Session

小編給大家分享一下Tomcat怎么監(jiān)控并刪除超時Session,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的澗西網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

前言

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

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

Session相關(guān)類圖

Tomcat怎么監(jiān)控并刪除超時Session

  • 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)類圖

Tomcat怎么監(jiān)控并刪除超時Session

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)用的會話信息。

Tomcat怎么監(jiān)控并刪除超時Session

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 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}
 * 

 * 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 isValid 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;
}

看完了這篇文章,相信你對“Tomcat怎么監(jiān)控并刪除超時Session”有了一定的了解,如果想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


當前名稱:Tomcat怎么監(jiān)控并刪除超時Session
標題路徑:http://weahome.cn/article/popgjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部