前言:

笔者在工作中,碰到一个需求,需要根据不同的用户来设置不同的session过期时间。

搜索了半天之后,主要都是在web.xml中通过设置session-timeout参数来设置过期时间,如下所示:

<session-config><session-timeout>15</session-timeout>
</session-config>

但是这样设置的,所有的session过期时间都是一样的。

如何设置不同的呢?网上也有答案,代码如下:

session.setMaxInactiveInterval(30*60);//以秒为单位

但是大家对这个参数的设置想法都不统一,有的说是全量的session,有的说是单独设置每个session的,也没有人能从源码角度来说明下,所以,笔者干脆自己下了tomcat的源码,源码在手,答案我有。

特意把这个过程整理为本文。

1.tomcat8.5源码下载导入

笔者公司使用的是tomcat8,所以特地下载了8.5的代码,笔者不需要编译,只需要把项目所需要的jar包引入下来即可。

由于其使用的是ant编译,笔者不太熟悉,所以就使用maven的方式引入包了。

1.1 创建pom.xml

我们主动在%tomcat_home%包路径下创建一个pom.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.apache.tomcat</groupId><artifactId>Tomcat8.5</artifactId><name>Tomcat8.5</name><version>8.5</version><build><finalName>Tomcat8.5</finalName><sourceDirectory>java</sourceDirectory><!--<testSourceDirectory>test</testSourceDirectory>--><resources><resource><directory>java</directory></resource></resources><!--<testResources>--><!--<testResource>--><!--<directory>test</directory>--><!--</testResource>--><!--</testResources>--><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><encoding>UTF-8</encoding><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.easymock</groupId><artifactId>easymock</artifactId><version>3.4</version></dependency><dependency><groupId>ant</groupId><artifactId>ant</artifactId><version>1.7.0</version></dependency><dependency><groupId>wsdl4j</groupId><artifactId>wsdl4j</artifactId><version>1.6.2</version></dependency><dependency><groupId>javax.xml</groupId><artifactId>jaxrpc</artifactId><version>1.1</version></dependency><dependency><groupId>org.eclipse.jdt.core.compiler</groupId><artifactId>ecj</artifactId><version>4.5.1</version></dependency></dependencies>
</project>

1.2 导入源码

导入就比较简单了,笔者使用idea导入,直接使用File -> Open 当前项目即可

pom.xml文件也通过Add Maven Project的方式引入进来,再点击Reimport即可,所需要的包都引入了下来。如下图所示:

2.HttpSession

tomcat中有关Session的接口是HttpSession,找到其实现类,默认为StandardSession。

2.1 StandardSession

public class StandardSession implements HttpSession, Session, Serializable {// session的相关属性集合protected ConcurrentMap<String, Object> attributes = new ConcurrentHashMap<>();// session创建时间protected long creationTime = 0L;// session是否过期protected transient volatile boolean expiring = false;// 唯一标识 idprotected String id = null;// 这个参数比较重要,表示当前session最后一个被访问的时间,默认为创建时间protected volatile long lastAccessedTime = creationTime;// 这个就是我们要寻找的参数,后续介绍protected volatile int maxInactiveInterval = -1;// 当前访问时间 TODOprotected volatile long thisAccessedTime = creationTime;}

2.2 session过期判断

public class StandardSession implements HttpSession, Session, Serializable {// 判断当前session是否有效public boolean isValid() {if (!this.isValid) {return false;}if (this.expiring) {return true;}if (ACTIVITY_CHECK && accessCount.get() > 0) {return true;}// 主要在这里// 如果用户设置了maxInactiveInterval参数,则需要判断// 如果设置maxInactiveInterval=-1,说明永不过期if (maxInactiveInterval > 0) {// 获取session空闲时间int timeIdle = (int) (getIdleTimeInternal() / 1000L);// 如果距离最后一个访问时间已经超过了maxInactiveInterval,则将session置为过期if (timeIdle >= maxInactiveInterval) {expire(true);}}return this.isValid;}public long getIdleTimeInternal() {// 主要就是拿当前时间与最后一次访问时间做比较lastAccessedTimelong timeNow = System.currentTimeMillis();long timeIdle;if (LAST_ACCESS_AT_START) {timeIdle = timeNow - lastAccessedTime;} else {timeIdle = timeNow - thisAccessedTime;}return timeIdle;}
}

所以通过源码可以知道,session是否过期的判断,主要是当前时间与session最后一次被访问时间之间的差值是否大于设置的maxInactiveInterval。

那么通过对不同的session设置不同的maxInactiveInterval是可以定制化session的过期时间的。

2.2 request与session

在request.getSession()获取session的时候,session的访问时间就已经被修改了。

public class Request implements HttpServletRequest {public HttpSession getSession() {Session session = doGetSession(true);if (session == null) {return null;}return session.getSession();}protected Session doGetSession(boolean create) {...Manager manager = context.getManager();if (manager == null) {return null;      // Sessions are not supported}if (requestedSessionId != null) {try {session = manager.findSession(requestedSessionId);} catch (IOException e) {if (log.isDebugEnabled()) {log.debug(sm.getString("request.session.failed", requestedSessionId, e.getMessage()), e);} else {log.info(sm.getString("request.session.failed", requestedSessionId, e.getMessage()));}session = null;}if ((session != null) && !session.isValid()) {session = null;}if (session != null) {// 设置session 访问时间,具体见2.2.1session.access();return session;}}...}
}

2.2.1 StandardSession.access()

public class StandardSession implements HttpSession, Session, Serializable {public void access() {// 将当前session访问时间重置为当前时间this.thisAccessedTime = System.currentTimeMillis();if (ACTIVITY_CHECK) {accessCount.incrementAndGet();}}
}

访问结束后,会调用StandardSession.endAccess()方法,如下所示:

public class StandardSession implements HttpSession, Session, Serializable {public void endAccess() {isNew = false;// 重置lastAccessedTime和thisAccessedTimeif (LAST_ACCESS_AT_START) {this.lastAccessedTime = this.thisAccessedTime;this.thisAccessedTime = System.currentTimeMillis();} else {this.thisAccessedTime = System.currentTimeMillis();this.lastAccessedTime = this.thisAccessedTime;}if (ACTIVITY_CHECK) {accessCount.decrementAndGet();}}
}

总结:

通过调用Session.setMaxInactiveInterval()方法可以自定义不同session的过期时间,且只对当前session有效。

tomcat session过期时间的设置相关推荐

  1. php中session时间,php中session过期时间的设置方法

    php中session过期时间的设置方法 发布时间:2020-04-22 10:21:19 来源:亿速云 阅读:140 作者:小新 今天小编给大家分享的是php中session过期时间的设置方法,相信 ...

  2. 转:设置session过期时间

    原文地址:设置session过期时间 Session一直是我们做web项目经常使用的,以前没太注意,这次又细致的看了下! 1.session其实就是一个Map,键=值对,通过session.getAt ...

  3. C#发布网站在web.config和IIS中设置Session过期时间

    C#发布网站在web.config和IIS中设置Session过期时间 web.config <system.web> <sessionState mode="InProc ...

  4. php修改sessiob时间_php中session过期时间设置

    网上很多人给出了解答:修改php配置文件中的session.gc_maxlifetime.如果想了解更多session回收机制,继续阅读.(本文环境php5.2) 概述:每一次php请求,会有1/10 ...

  5. cookielifetime php_php中实现精确设置session过期时间的方法

    大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一下session过期时间. 对此,可以在PHP中,设置php.ini,找到session. ...

  6. java设置过期时间_java设置session过期时间的实现方法

    本文实例讲述了java设置session过期时间的实现方法,分享给大家供大家参考.具体实现方法如下: 1.Timeout in the deployment descriptor (web.xml) ...

  7. 设置session时间 php,php中实现精确设置session过期时间的方法

    这篇文章主要介绍了php中实现精确设置session过期时间的方法,需要的朋友可以参考下 大多数据情况下我们对于session过期时间使用的是默认设置的时间,而对于一些有特殊要求的情况下我们可以设置一 ...

  8. php网站源码 设置有效时间,精确设置php中session过期时间的方法

    session过期时间在大多数据情况下我们是设置默认的时间,如果我们有一些特殊的要求可以设置一下session过期时间了,下面我整理了在使用session中一些问题与解决方法,希望例子对各位会有帮助. ...

  9. PDF文档过期时间/自毁设置/到期打不开

    PDF文档过期时间/自毁设置/到期打不开 maipdf 有两个版本 在线版的 pdf链接,可以设置到期时间和阅读次数 离线版的pdf,把pdf变成一个桌面文件,到期就无法打开. 这些都是市场上十几万一 ...

  10. java session时间_Java基础:里设置session过期时间

    由于session值之前没有设置,以至于刚登录的网站,不到一分钟就超时了,总结了一下,原来是session过期的原因,以下是设置session时间的3个方法: 1. 在tomcat-->conf ...

最新文章

  1. activeMQ 本地测试
  2. java程序实现按并发数收费_java-实战java高并发程序设计-ch3JDK并发包
  3. 对比less聊scss(1):scss特性
  4. WCF传送大数据时的错误“ 超出最大字符串内容长度配额”
  5. 获取系统特殊文件夹的路径
  6. 网络语言对作文教学的冲击
  7. Pycharm如何选择自动打开最近项目
  8. Chrome截图扩展程序-“截图快手”
  9. Jira Bamboo中创建Windows Remote Agent的注意事项
  10. 7 招教你轻松搭建以图搜图系统!
  11. python零基础能学吗-零基础怎么样才能学好Python?Python入门必看
  12. 使用epublib自动生成epub文件
  13. 磨刀室-文本编辑之全面接触PDF:最好用的PDF软件汇总(转)
  14. mysql触发器新增或修改_mysql触发器实例 插入数据前更改数据值
  15. 再梳理一下seqtoseq,encoder-decoder,attention,transformer的概念
  16. SpringBoot日记本系统 :关键字搜索BUG(Mybatisplus and和or的问题)
  17. np.percentile用法
  18. 内存规格的解释(Unbuffered DIMM,Registered DIMM和SODIMM)
  19. 数学运算符“异或”的妙用
  20. win7 如何锁定计算机,Win7系统如何锁定计算机

热门文章

  1. 学成在线 网页前端(源码DIV+CSS)
  2. python 文件操作新姿势 pathlib模块的详细使用
  3. android高德地图选取坐标点,【API】高德地图API JS实现获取坐标和回显点标记(示例代码)...
  4. 中国知名it软件开发外包公司有哪些呢
  5. 2022系统软件开发公司排行榜
  6. 产品结构图、功能结构图、信息结构图,区别在这里
  7. 数据通信技术初级工程师证题库
  8. php字游戏源码,php文字游戏寻仙纪.zip
  9. 工具类 --UUIDUtil ---32位UUID生成器
  10. 模糊控制算法基础知识