详解SpringBoot中Session超时原理说明

详解SpringBoot中Session超时原理说明

本篇文章主要介绍了详解跳羚中会议超时原理说明,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一:前言:

最近支付后台登录一段时间后如果没有任何操作,总是需要重新登录才可以继续访问页面,出现这个问题的原因就是会议超时,调试代码后发现会议的超时时间是十九世纪。也就是说当1800秒内没有任何操作,会话就会出现超时现象。那这个超时时间是如何设置的呢?然后该如何重新设置此超时时间呢?系统又如何判断会议超时的呢?接下来就一一进行解答。

二:系统session超时时间如何默认的?

说明:获取会议超时时间的方法为request.getSession().getMaxInactiveInterval(),但是雄猫中设置超时时间的参数为"会话超时",那么他们是怎么联系起来的呢?

第一步:加载sessionTimeout参数。

1、项目运行初始化通过" @配置属性"注解加载“org。spring框架。靴子。自动配置。网络。服务器属性"类。

//跳靴中默认的配置文件为 application.yml 或者应用程序。属性文件,也就是说计算机网络服务器是其中的一个配置参数。

@配置属性(前缀=server ,ignoreUnknownFields=true)

公共类服务器属性

实现嵌入式ServletContainerCustomizer,EnvironmentAware,Ordered {

//代码

}

2、上面类中"服务器属性"继承自"嵌入式ServletContainerCustomizer接口。重写定制方法,之后在此方法中"向上推",即可找到" AbstractConfigurableEmbeddedServletContainer "类。

@覆盖

public void customize(ConfigurableEmbeddedServletContainer容器){

//多个参数判断,如果在应用中没配置的情况下都是空

if (getPort()!=null) {

集装箱。set port(get port());

}

.//n多个参数判断,

//以下的代码就是重点,因为是雄猫容器,所以以下条件为"真",经过一系列的查找父类或者实现接口即可找到抽象类" AbstractConfigurableEmbeddedServletContainer "

//公共类TomcatEmbeddedServletContainerFactory扩展AbstractEmbeddedServletContainerFactory实现资源加载软件

//公共抽象类AbstractEmbeddedServletContainerFactory扩展AbstractConfigurableEmbeddedServletContainer实现嵌入式servletcontainer工厂

if(TomcatEmbeddedServletContainerFactory的容器实例){

getTomcat().customizeTomcat(这个,

(TomcatEmbeddedServletContainerFactory)容器);

}

//以上代码执行完成之后,实际上已经有对应的会议所有的默认参数,之后通过下面方法,将所有参数放入对应的容器中。第3、4步就是设置过程

container.addInitializers(新会话配置初始化器(这个。会话));

}

3、在" AbstractConfigurableEmbeddedServletContainer "类中终于可以找到"超时时间"的相关设置

//重要代码

//45行

私有静态最终int DEFAULT _ SESSION _ time out=(int)时间单位.分钟。到秒(30);

//66行

private int会话超时=DEFAULT _ SESSION _ time out

@覆盖

public void setsession超时(int session超时){

这个。会话超时=会话超时;

}

//171-188行

@覆盖

public void setsession超时(int session超时,TimeUnit timeUnit) {

Assert.notNull(时间单位,时间单位不得为null’);

这个。会话超时=(int)时间单位。到秒(会话超时);

}

/**

*以秒为单位返回会话超时。

* @返回超时时间(秒)

*/

public int getSessionTimeout() {

返回这个。会话超时;

}

4、执行第2步的" Container.addInitializers(新会话配置初始化器(this.session))加载所有的配置参数。

公共静态类会话{

/**

*会话超时秒数。

*/

私有整数超时;

公共整数getTimeout() {

返回this .超时

}

//将会议超时时间设置进来

公共void设置超时(整数会话超时){

这个。超时=会话超时;

}

第二步:将上面的超时时间赋值给“MaxInactiveInterval”参数。

说明:既然上面雄猫需要的参数都已经加载完成,那么接下来就会运行雄猫,此处不做细讲,直接进入雄猫启动和加载参数说明。在" TomcatEmbeddedServletContainerFactory "类中的方法调用流程如下:

getEmbeddedServletContainer-》准备上下文-》配置上下文-》配置会话-》getSessionTimeoutInMinutes。

1、调用配置会话设置雄猫的会议配置参数。

//以下代码

私有无效配置会话(上下文上下文){

长会话超时=getsession超时(分钟)();

语境。setsessiontimeout((int)会话超时);

经理经理=上下文。get manager();

if (manager==null) {

manager=新标准管理器();

//此处即为设置相应的参数的位置。之后会调用标准上下文类的setManger(经理)方法,在setManger中会调用 manager.setContext(this)

context.setManager(管理器);

}

}

//计算超时时间为分钟(注意:此处会将之前的1800秒,转换为30分钟)。可以看出最终的时间结果是个整数的分钟类型,也就是说如果设置的超时时间(单位为秒)不是60的倍数,也会最终转换为60的倍数,并且最小超时时间设置的是60秒。

private long getSessionTimeoutInMinutes(){

长会话超时=getsession超时();

if (sessionTimeout 0) {

sessionTimeout=Math.max(时间单位10.25秒。tomi mintes(会议暂停),1L);

}

返回会话超时

}

2、最终将会话超时赋值给最大有效间隔。终于完成会议超时时间设置。

//以下代码

@覆盖

公共空集上下文(Context Context){

//省略其余设置代码,直接重新设置会议超时时间,此时又将上面的分钟单位转为秒。此时终于给Sesseion设置了默认超时时间。

如果(this.context!=null) {

setMaxInactiveInterval(this。语境。getsession超时()* 60);

这个。语境。addpropertychangelister(this);

}

}

三:如果自定义超时时间呢?

其实从上面的流程,已经不难看出,只需要在“org。spring框架。靴子。自动配置。网络。服务器属性"类中找到对应的会议参数,初始化让其加载上来即可完成设置。

/**

*获取会话超时。

* @返回会话超时

* @从1.3.0起已弃用,取而代之的是{@code session.timeout} .

*/

@已弃用

@ DeprecatedConfigurationProperty(replacement= server。会话。超时’)

公共整数getSessionTimeout() {

返回这个。会话。gettime out();

}

所以在应用中配置" server.session.timeout "即可,参数类型为长的类型,单位为"秒"。

四:运行程序是如何判断session超时的?

其实很简单:只需要在每次本次同一个sessionequest请求的时间,和之前的请求时间进行比较,发现两个值的差已经大于最大有效间隔的值即可。

//判断是否超时

@覆盖

公共布尔值isValid() {

//省略多个条件判断

if (maxInactiveInterval 0) {

//判断此会议空闲时间是否比最大有效间隔大,如果大的情况下,会话就超时

int time idle=(int)(getIdleTimeInternal()/1000 l);

if(time idle=maxInactiveInterval){

过期(真);

}

}

返回这个。有效;

}

//将上次访问时间和当前时间比较,拿到空闲时间值

@覆盖

public long getIdleTimeInternal(){

现在很长时间=系统。当前时间毫秒();

长时间闲置;

if (LAST_ACCESS_AT_START) {

time idle=time now-lastAccessedTime;

}否则{

time idle=time now-thisAccessedTime;

}

返回空闲时间

}

说明:

所以为了保证会议超时时间长点,可以在应用配置文件中配置" server.session.timeout "参数即可,参数单位为"秒",如果参数不是60的整数倍,会转换成60的整数倍(见二:系统如何设置超时时间、步骤二中的"1"中算法)。如不满一分钟,会转换为60秒。

扩展:

实际上也可以直接重写嵌入式ServletContainerCustomizer的定制方法进行赋值。

@Bean

公共嵌入式servletcontainercustomizer containerCustomizer(){

返回新的嵌入式ServletContainerCustomizer() {

@覆盖

public void customize(ConfigurableEmbeddedServletContainer容器){

集装箱。setsessiontimeout(600);//单位为S

}

};

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

详解SpringBoot中Session超时原理说明