SpringBoot设置Session失效时间

  • SpringBoot设置Session失效时间
  • 先别急着关,你是不是也被这样的重复信息洗脑了?到底是怎么个失效机制呢?根本没解释清楚嘛!
  • 今天,我就来讲一讲我的经验!
  • 一、一些准备
  • 1.监听器代码
  • 2.注册监听器代码
  • 二、时间计算
  • 1.最初测试(销毁时间80秒)
  • 1.1测试1
  • 创建时间和销毁时间:12:03:59和12:05:50
  • 相差时间:111秒
  • 1.2测试2
  • 创建时间和销毁时间:12:06:03和12:07:50
  • 相差时间:107秒
  • 2.最终测试(销毁时间10秒)
  • 2.1测试1
  • 我等了将近2分钟!
  • 创建时间:12:11:28
  • 销毁时间:12:13:27
  • 相差时间:119秒
  • 猜测:
  • 2.2测试2
  • 创建时间:12:19:48
  • 预测销毁时间:12:21:27
  • 真实销毁时间:12:21:27
  • 2.2测试3
  • 创建时间:12:22:11![在这里插入图片描述](https://s2.51cto.com/images/blog/202310/14133529_652a28a16dc2d36714.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
  • 预测销毁时间:12:23:27
  • 真实销毁时间:12:23:27
  • 三、结论


SpringBoot设置Session失效时间

1 #Session超时时间设置,单位是秒,默认是30分钟 2 server.session.timeout=10

然而并没有什么用,因为SpringBoot在TomcatServletWebServerFactory代码中写了这个

1 private long getSessionTimeoutInMinutes() { 2 Duration sessionTimeout = this.getSession().getTimeout(); 3 return this.isZeroOrLess(sessionTimeout) ? 0L : Math.max(sessionTimeout.toMinutes(), 1L); 4 }

这里引用的链接是

先别急着关,你是不是也被这样的重复信息洗脑了?到底是怎么个失效机制呢?根本没解释清楚嘛!

今天,我就来讲一讲我的经验!

一、一些准备

要弄懂这个问题,首先需要配置一个Session的监听器,并把他注册到SpringBoot的容器中,用来监听Session何时被创建,又何时被销毁

1.监听器代码
public class MyListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("创建session" + new Date());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("销毁session" + new Date());
    }
}
2.注册监听器代码
@Configuration
public class MySpringMvcConfigurer {
    /**
     * 注册监听器Listener
     * @return
     */
    @Bean
    public ServletListenerRegistrationBean myListener() {
        ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(new MyListener());
        return bean;
    }
}

这个时候,启动SpringBoot的时候,就可以监听Session的创建和消失了。

二、时间计算

1.最初测试(销毁时间80秒)

我是怎么找到规律的呢,是我先进行了两次测试,发现一件事:销毁时间的秒数是固定的!

此次测试的销毁时间我填的80秒。

server.servlet.session.timeout=80
1.1测试1
创建时间和销毁时间:12:03:59和12:05:50

spring boot 设置网络超时 spring boot session timeout_后端

相差时间:111秒
1.2测试2
创建时间和销毁时间:12:06:03和12:07:50

spring boot 设置网络超时 spring boot session timeout_session_02

相差时间:107秒

就是经过这两个测试,我开始怀疑,他的销毁时间不是固定的,而是和监测时间有关!

2.最终测试(销毁时间10秒)

带着这样的疑问,我把销毁时间改为了10秒并准备进行第二次测试。

server.servlet.session.timeout=10
2.1测试1
我等了将近2分钟!
创建时间:12:11:28

这个忘了截图了。但是应该是这个时间没错了,因为我记得很清楚,是刚重启成功就登录的,创建的session!

销毁时间:12:13:27

spring boot 设置网络超时 spring boot session timeout_java_03

相差时间:119秒
猜测:

应该能确定,本次的监测时间是每分钟的27秒,这大概就是我成功启动服务器的时间的秒数。

而,按照现在的情况来看,不难猜测,他开始计时的时间,也是每轮监测时间的时候,也就是说,我这次测试,他是12:12:27的时候才开始倒计时10秒,然后在12:13:27的时候,发现时间已经减到<10了,就此销毁session

这样想的话,只需进行两次测试,一次27秒前,一次27秒后,看预测时间是否正确就行了!

(因为这个原因,甚至你设置1秒和59秒都没有区别的!不过他的前后误差绝对不会超过2分钟就是了!)

2.2测试2
创建时间:12:19:48

啊这,忘了截图。。。。

预测销毁时间:12:21:27
真实销毁时间:12:21:27

spring boot 设置网络超时 spring boot session timeout_spring boot 设置网络超时_04

2.2测试3
创建时间:12:22:11

spring boot 设置网络超时 spring boot session timeout_后端_05

预测销毁时间:12:23:27
真实销毁时间:12:23:27

spring boot 设置网络超时 spring boot session timeout_spring boot 设置网络超时_06

三、结论

就是之前的猜测