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

Posted SpringBoot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了260.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分钟。


历史文章

























我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟空学院:http://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/R3QepWG

Spring Cloud视频:http://t.cn/R3QeRZc

SpringBoot Shiro视频:http://t.cn/R3QDMbh

SpringBoot交流平台:http://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/R1pSojf

SpringSecurity5.0视频:http://t.cn/EwlLjHh

Sharding-JDBC分库分表实战:http://t.cn/E4lpD6e

以上是关于260.Spring Boot+Spring Security:设置登录过期时间的正确姿势的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 之注解

Spring boot??????????????????Spring boot??????MySql,Mybatis???PageHelper??????

Spring Boot 事物回滚

使用 Spring Boot 时如何使用 SpringTemplateEngine

jboss spring boot

spring boot微服务通用部署启动脚本