Tomcat如何监控并删除超时Session详解

 更新时间:2019年04月16日 08:31:42   作者:猫毛·波拿巴  
这篇文章主要给大家介绍了关于Tomcat如何监控并删除超时Session的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Tomcat具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

偶然发现Tomcat会话时间的半小时,并不是说会话创建后,只有半小时的有效使用时间,而是说会话空闲半小时后,会被删除。索性就翻了一下源码。做了一番整理。

注:空闲时间,指的是同一个会话两次请求之间的间隔时间

Session相关类图


  • HttpSession就是大家Servlet层可以直接使用的Session.
  • Session是Tomcat内部使用的接口,可以做一些内部调用
  • StandardSession是标准的HttpSession实现,同时它也实现了Session接口,用于Tomcat内部管理
  • StandardSessionFacade,类名已经指明它就是一个“门面类”,它内部会引用一个StandardSession的对象,但对外只提供HttpSession规定的方法。

Manager相关类图


StandardManager与PersitentManager都是Manager的实现,但是它们在存储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就能依此找到关联的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)的时候,开启一个额外的线程来执行这个backgroundProcess方法。其中Context的这个方法启动后,会执行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的数量,不要被这个变量名骗了

 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过期失效的操作,好像只做了状态检查。不过后来看到了Session的isValid方法的实现就都明白了。

/**
 * 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的空闲时间进行判断
 //如果已超时,则执行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的实现原理

    Tomcat修正JDK原生线程池bug的实现原理

    这篇文章主要介绍了Tomcat是如何修正JDK原生线程池bug的,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Tomcat进程假死问题排查

    Tomcat进程假死问题排查

    本文主要介绍了Tomcat进程假死问题排查,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 对一个tomcat实现多端口、多域名访问的方法

    对一个tomcat实现多端口、多域名访问的方法

    这篇文章主要是介绍如何在tomcat中进行配置,使同一个应用可以通过不同的端口号进行访问。大家可能都遇到过,在某些需要进行安全控制的场景中会应用到,例如:不同地址段只能通过某个端口访问。下面通过这篇文章来详细学习下吧,有需要的可以参考借鉴。
    2016-11-11
  • Tomcat下载安装并部署到IDEA的教程(附带idea两种热部署设置方法)

    Tomcat下载安装并部署到IDEA的教程(附带idea两种热部署设置方法)

    这篇文章主要介绍了Tomcat下载安装并部署到IDEA的教程(附带idea两种热部署设置方法),本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • linux系统中修改tomcat默认输入日志路径的方法

    linux系统中修改tomcat默认输入日志路径的方法

    本文给大家介绍了linux系统中修改tomcat默认输入日志路径的方法,文中只是给大家介绍linux系统修改默认logs的方法,windows系统类似,需要的朋友可以参考下
    2018-03-03
  • 使用IntelliJ IDEA配置Tomcat入门教程

    使用IntelliJ IDEA配置Tomcat入门教程

    这篇文章主要介绍了使用IntelliJ IDEA配置Tomcat入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Linux下定时切割Tomcat日志并删除指定天数前的日志记录

    Linux下定时切割Tomcat日志并删除指定天数前的日志记录

    这篇文章主要介绍了Linux下定时切割Tomcat日志并删除指定天数前的日志记录,需要的朋友可以参考下
    2017-08-08
  • 详解tomcat热部署和热加载的方法

    详解tomcat热部署和热加载的方法

    这篇文章主要介绍了详解tomcat热部署和热加载的方法的相关资料,这里提供两种tomcat热部署和热加载的方法,需要的朋友可以参考下
    2017-08-08
  • 一次tomcat自动关闭的bug解决

    一次tomcat自动关闭的bug解决

    这篇文章主要给大家介绍了一次关于tomcat自动关闭的bug的解决过程,文中通过示例代码介绍的非常详细,对大家学习或者使用tomcat具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08

最新评论