(1)JDK版本:1.8
(2)Spring Boot 2.0.6
(3)Spring Security 5.0.9
(4)Spring Data JPA 2.0.11.RELEASE
(5)hibernate5.2.17.Final
(6)MySQLDriver 5.1.47
(7)MySQL 8.0.12
需求缘起
有网友在公众号文章下留言:怎么设置登录过期时间,搞了好久找过不少资料就是没看到,楼主指点一下~
博主回复:spring boot2.x的版本的话,设置属性:server.servlet.session.timeout=60;1.x的版本的话,设置属性:server.session.timeout=60;注意时间单位是秒;特别注意的地方:如果设置小于60秒的话,则会默认取1分钟!
对方回复:感谢您的回复,我就是如此设置的,但是似乎没用,所以想问一下是不是有其他方法
那这是为什么呢?这就是本偏博客要解决的问题。
一、设置session的超时时间
设置session的超时时间还是很简单的,直接在application.properties进行配置即可,当然需要注意SpringBoot的版本:
Spring Boot 1.x配置如下:
server.session.timeout=60
注意时间单位是秒;特别注意的地方:如果设置小于60秒的话,则会默认取1分钟!
Spring Boot 2.x配置如下:
server.servlet.session.timeout=60
注意时间单位是秒;特别注意的地方:如果设置小于60秒的话,则会默认取1分钟!
如果设置了这个超时时间,但是到了时间并没有退出登录的话,那么接着往下看吧。
二、设置cookie的超时时间
当配置了“记住我“之后,session超时之后,如果remember-me的cookie并没有超时的话,还是会自动登录的,所以此时就需要正确的配置remember-me的超时时间了。
当使用简单加密token的方式,使用TokenBasedRememberMeServices进行配置:
tokenBasedRememberMeServices.setTokenValiditySeconds(60);
当使用持久化token的方式,在rememberMe()之后进行配置
.and().rememberMe().tokenValiditySeconds(60)
三、题外话:为什么session设置了小于60秒会取1分钟?
我们找到这么一个类
TomcatServletWebServerFactory,里面有一个配置session的方法:
private void configureSession(Context context) {
long sessionTimeout = getSessionTimeoutInMinutes();
context.setSessionTimeout((int) sessionTimeout);
Boolean httpOnly = getSession().getCookie().getHttpOnly();
if (httpOnly != null) {
context.setUseHttpOnly(httpOnly);
}
if (getSession().isPersistent()) {
Manager manager = context.getManager();
if (manager == null) {
manager = new StandardManager();
context.setManager(manager);
}
configurePersistSession(manager);
}
else {
context.addLifecycleListener(new DisablePersistSessionListener());
}
}
这里调用了方法:
getSessionTimeoutInMinutes():
private long getSessionTimeoutInMinutes() {
Duration sessionTimeout = getSession().getTimeout();
if (isZeroOrLess(sessionTimeout)) {
return 0;
}
return Math.max(sessionTimeout.toMinutes(), 1);
}
这里看最后return的代码,就是如果设置的超时时间小于1分钟的话,那么就取1分钟。