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

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

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

前言

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

注:空閑時(shí)間,指的是同一個(gè)會(huì)話(huà)兩次請(qǐng)求之間的間隔時(shí)間

Session相關(guān)類(lèi)圖


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

Manager相關(guān)類(lèi)圖


StandardManager與PersitentManager都是Manager的實(shí)現(xiàn),但是它們?cè)诖鎯?chǔ)Session對(duì)象的方式上有所不同。

StandarManager

1.Tomcat運(yùn)行時(shí),把Session存儲(chǔ)在內(nèi)存中

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

PersistentManager

1.總是把Session存儲(chǔ)在磁盤(pán)中。

Manager與Context的關(guān)系

在Tomcat中,一個(gè)Context就是部署到Tomcat中的一個(gè)應(yīng)用(Webapp)。每一個(gè)Context都有一個(gè)單獨(dú)的Manager對(duì)象來(lái)管理這個(gè)應(yīng)用的會(huì)話(huà)信息。

Manager如何存儲(chǔ)Session

Manager對(duì)象會(huì)使用一個(gè)Map來(lái)存儲(chǔ)Session對(duì)象

  • 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)一個(gè)請(qǐng)求到達(dá)Context的時(shí)候,如果它帶有JSESSIONID的Cookie,Manager就能依此找到關(guān)聯(lián)的Session對(duì)象,放入到Request對(duì)象中。

Manager的定期檢查

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

/**
  * 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接口也有這個(gè)方法,這個(gè)方法一般在容器啟動(dòng)(start)的時(shí)候,開(kāi)啟一個(gè)額外的線程來(lái)執(zhí)行這個(gè)backgroundProcess方法。其中Context的這個(gè)方法啟動(dòng)后,會(huì)執(zhí)行Loader和Manager的backgroundProcess方法。

我們來(lái)看看這個(gè)方法都做了些什么?

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

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

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

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

}

很多人看到這里,可能會(huì)有跟我一樣的疑惑,即這里面根本就沒(méi)有使Session過(guò)期失效的操作,好像只做了狀態(tài)檢查。不過(guò)后來(lái)看到了Session的isValid方法的實(shí)現(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è)置最大空閑時(shí)間
 //就獲取此Session的空閑時(shí)間進(jìn)行判斷
 //如果已超時(shí),則執(zhí)行expire操作
 if (maxInactiveInterval > 0) { 
  int timeIdle = (int) (getIdleTimeInternal() / 1000L);
  if (timeIdle >= maxInactiveInterval) {
   expire(true);
  }
 }

 return this.isValid;
}

總結(jié)

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

相關(guān)文章

  • Tomcat實(shí)現(xiàn)WebSocket的方法

    Tomcat實(shí)現(xiàn)WebSocket的方法

    WebSocket協(xié)議屬于HTML5標(biāo)準(zhǔn),越來(lái)越多瀏覽器已經(jīng)原生支持WebSocket,它能讓客戶(hù)端和服務(wù)端實(shí)現(xiàn)雙向通信。這篇文章主要介紹了Tomcat實(shí)現(xiàn)WebSocket的方法的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • 關(guān)于tomcat部署應(yīng)用無(wú)法訪問(wèn)前端頁(yè)面的問(wèn)題

    關(guān)于tomcat部署應(yīng)用無(wú)法訪問(wèn)前端頁(yè)面的問(wèn)題

    這篇文章主要介紹了關(guān)于tomcat部署應(yīng)用無(wú)法訪問(wèn)前端頁(yè)面的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Tomcat整體結(jié)構(gòu)簡(jiǎn)單介紹

    Tomcat整體結(jié)構(gòu)簡(jiǎn)單介紹

    這篇文章主要介紹了Tomcat整體結(jié)構(gòu)簡(jiǎn)單介紹,Tomcat的本質(zhì)是一個(gè)Servlet容器。一個(gè)Servlet能做的事情是:處理請(qǐng)求資源,并為客戶(hù)端填充response對(duì)象,需要的朋友可以參考下
    2019-07-07
  • Tomcat使用https配置實(shí)戰(zhàn)教程

    Tomcat使用https配置實(shí)戰(zhàn)教程

    這篇文章主要介紹了Tomcat使用https配置實(shí)戰(zhàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • 兩種方法解決Tomcat控制臺(tái)輸出中文的亂碼問(wèn)題

    兩種方法解決Tomcat控制臺(tái)輸出中文的亂碼問(wèn)題

    本文主要給大家介紹了兩種方法解決Tomcat控制臺(tái)輸出中文的亂碼問(wèn)題,文章通過(guò)圖文結(jié)合的方式給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11
  • startup.bat啟動(dòng)Tomcat閃退問(wèn)題原因及解決

    startup.bat啟動(dòng)Tomcat閃退問(wèn)題原因及解決

    本文主要介紹了startup.bat啟動(dòng)Tomcat閃退問(wèn)題原因及解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Tomcat starup.bat腳本開(kāi)機(jī)自啟動(dòng)的實(shí)現(xiàn)

    Tomcat starup.bat腳本開(kāi)機(jī)自啟動(dòng)的實(shí)現(xiàn)

    本文主要介紹了Tomcat starup.bat腳本開(kāi)機(jī)自啟動(dòng)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Tomcat進(jìn)程假死問(wèn)題排查

    Tomcat進(jìn)程假死問(wèn)題排查

    本文主要介紹了Tomcat進(jìn)程假死問(wèn)題排查,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 在MyEclipse上部署Tomcat服務(wù)器的方法

    在MyEclipse上部署Tomcat服務(wù)器的方法

    這篇文章主要介紹了在MyEclipse上部署Tomcat服務(wù)器的方法,需要的朋友可以參考下
    2016-04-04
  • 在Windows10中安裝TomCat的教程圖解

    在Windows10中安裝TomCat的教程圖解

    Tomcat 服務(wù)器是一個(gè)免費(fèi)的開(kāi)放源代碼的Web 應(yīng)用服務(wù)器,屬于輕量級(jí)應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問(wèn)用戶(hù)不是很多的場(chǎng)合下被普遍使用,是開(kāi)發(fā)和調(diào)試JSP 程序的首選。這篇文章主要介紹了在Windows10中安裝TomCat的教程圖解,需要的朋友可以參考下
    2019-11-11

最新評(píng)論