热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要给大家介绍了关于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 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}
 * 

* 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

很多人看到这里,可能会有跟我一样的疑惑,即这里面根本就没有使Session过期失效的操作,好像只做了状态检查。不过后来看到了Session的isValid方法的实现就都明白了。

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

 //关键所在
 //如果有设置最大空闲时间
 //就获取此Session的空闲时间进行判断
 //如果已超时,则执行expire操作
 if (maxInactiveInterval > 0) { 
  int timeIdle = (int) (getIdleTimeInternal() / 1000L);
  if (timeIdle >= maxInactiveInterval) {
   expire(true);
  }
 }

 return this.isValid;
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。


推荐阅读
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 本文详细介绍如何在华为鲲鹏平台上构建和使用适配ARM架构的Redis Docker镜像,解决常见错误并提供优化建议。 ... [详细]
  • Tomcat SSL 配置指南
    本文详细介绍了如何在 Tomcat 中配置 SSL,以确保 Web 应用的安全性。通过正确的配置,可以启用 HTTPS 协议并保护数据传输的安全。 ... [详细]
  • 本文将探讨如何在 Struts2 中使用 ActionContext 和 ServletActionContext 来获取请求参数和会话信息,同时解释它们的内部机制和最佳实践。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • Centos7 Tomcat9 安装笔记
    centos7,tom ... [详细]
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • 使用System.getProperty()获取系统属性
    本文详细介绍了如何使用System.getProperty()方法获取Java运行时环境中的各种系统属性,包括Java版本、操作系统信息等。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 深入理解Java多线程与并发机制
    本文探讨了Java多线程和并发机制的核心概念,包括多线程类的分类、执行器框架、并发容器及控制工具。通过详细解析这些组件,帮助开发者更好地理解和应用多线程技术。 ... [详细]
  • 本文档介绍了如何使用OpenStack命令行工具在Keystone身份服务中创建和管理域、项目、用户及角色。随着Keystone命令向OpenStack命令集的迁移,了解这些新的命令格式对于系统管理员来说至关重要。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 深入理解Dockerfile及其作用
    Dockerfile是一种文本格式的配置文件,用于定义构建Docker镜像所需的步骤。通过使用`docker build`命令,用户可以将Dockerfile中的一系列指令转换成一个可执行的Docker镜像。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
author-avatar
liangpengtao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有