Spring Boot+Spring Security:设置登录过期时间的正确姿势

(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分钟。

你可能感兴趣的:(SpringSecurity,spring,boot)