最近让Spring Boot内嵌Tomcat的session超时问题给坑了一把。
在应用中需要设置session超时时间,然后就习惯的在application.properties配置文件中设置如下,
server.session.timeout=90
这里把超时时间设置的短些,主要想看看到底有没有起作用(不能设值30min然后再看吧,那样太不人道了)。结果没起作用,百度下发现Spring Boot 2后,配置变成如下,
server.servlet.session.timeout=90
但结果依然不起作用,后来就断断续续的懵了逼的找问题原因,各种百度,google,最后觉得还是看源代码吧,顺便也学习下。
1. 既然是Session超时时间问题,那就看看对Session的实现 - StandardSession
其中有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; } if (maxInactiveInterval > 0) { int timeIdle = (int) (getIdleTimeInternal() / 1000L); if (timeIdle >= maxInactiveInterval) { expire(true); } } return this.isValid; }
看了下,这里的 timeIdle >= maxInactiveInterval就是触发session超时的判断,满足则调用 expire(true)。那么问题就来了,什么时候调用isValid()?
2. 后台肯定有定时调用isValid()的线程
查看