一:前言:

最近支付后台登录一段时间后如果没有任何操作,总是需要重新登录才可以继续访问页面,出现这个问题的原因就是session超时,debug代码后发现session的超时时间是1800s。也就是说当1800秒内没有任何操作,session就会出现超时现象。那这个超时时间是如何设置的呢?然后该如何重新设置此超时时间呢?系统又如何判断session超时的呢?接下来就一一进行解答。
二:系统session超时时间如何默认的?
说明:获取session超时时间的方法为”request.getSession().getMaxInactiveInterval()",但是tomcat中设置超时时间的参数为“sessionTimeout”,那么他们是怎么联系起来的呢?
第一步:加载sessionTimeout参数。
1、项目运行初始化通过“@ConfigurationProperties”注解加载“org.springframework.boot.autoconfigure.web.ServerProperties”类。
//springBoot中默认的配置文件为"application.yml"或者"application.perties"文件,也就是说server是其中的一个配置参数。
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties
implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered {
//代码
}
2、上面类中“ServerProperties”继承自“EmbeddedServletContainerCustomizer”接口。重写customize方法,之后在此方法中“向上推”,即可找到“AbstractConfigurableEmbeddedServletContainer ”类。
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
//多个参数判断,如果在application中没配置的情况下都是null
if (getPort() != null) {
container.setPort(getPort());
}
...//n多个参数判断,
//以下的代码就是重点,因为是tomcat容器,所以以下条件为“真”,经过一系列的查找父类或者实现接口即可找到抽象类“AbstractConfigurableEmbeddedServletContainer”
//public class TomcatEmbeddedServletContainerFactory extends AbstractEmbeddedServletContainerFactory implements ResourceLoaderAware
//public abstract class AbstractEmbeddedServletContainerFactory extends AbstractConfigurableEmbeddedServletContainer implements EmbeddedServletContainerFactory
if (container instanceof TomcatEmbeddedServletContainerFactory) {
getTomcat().customizeTomcat(this,
(TomcatEmbeddedServletContainerFactory) container);
}
//以上代码执行完成之后,实际上已经有对应的session所有的默认参数,之后通过下面方法,将所有参数放入对应的容器中。第3、4步就是设置过程
container.addInitializers(new SessionConfiguringInitializer(this.session));
}
3、在“AbstractConfigurableEmbeddedServletContainer”类中终于可以找到“超时时间”的相关设置
//重要代码
//45行
private static final int DEFAULT_SESSION_TIMEOUT = (int) TimeUnit.MINUTES
.toSeconds(30);
//66行
private int sessionTimeout = DEFAULT_SESSION_TIMEOUT;
@Override
public void setSessionTimeout(int sessionTimeout) {
this.sessionTimeout = sessionTimeout;
}
//171-188行
@Override
public void setSessionTimeout(int sessionTimeout, TimeUnit timeUnit) {
Assert.notNull(timeUnit, "TimeUnit must not be null");
this.sessionTimeout = (int) timeUnit.toSeconds(sessionTimeout);
}
/**
* Return the session timeout in seconds.
* @return the timeout in seconds
*/
public int getSessionTimeout() {
return this.sessionTimeout;
}
4、执行第2步的”Container.addInitializers(new SessionConfiguringInitializer(this.session))“加载所有的配置参数。
public static class Session {
/**
* Session timeout in seconds.
*/
private Integer timeout;
public Integer getTimeout() {
return this.timeout;
}
//将session超时时间设置进来
public void setTimeout(Integer sessionTimeout) {
this.timeout = sessionTimeout;
}
第二步:将上面的超时时间赋值给“MaxInactiveInterval”参数。
说明:既然上面tomcat需要的参数都已经加载完成,那么接下来就会运行tomcat,此处不做细讲,直接进入tomcat启动和加载参数说明。在“TomcatEmbeddedServletContainerFactory”类中的方法调用流程如下:
getEmbeddedServletContainer--》prepareContext--》configureContext--》configureSession--》getSessionTimeoutInMinutes。
1、调用configureSession设置tomcat的Session配置参数。
//以下代码
private void configureSession(Context context) {
long sessionTimeout = getSessionTimeoutInMinutes();
context.setSessionTimeout((int) sessionTimeout);
Manager manager = context.getManager();
if (manager == null) {
manager = new StandardManager();
//此处即为设置相应的参数的位置。之后会调用StandardContext类的setManger(Manager)方法,在setManger中会调用"manager.setContext(this)"
context.setManager(manager);
}
}
//计算超时时间为分钟(注意:此处会将之前的1800秒,转换为30分钟)。可以看出最终的时间结果是个整数的分钟类型,也就是说如果设置的超时时间(单位为秒)不是60的倍数,也会最终转换为60的倍数,并且最小超时时间设置的是60秒。
private long getSessionTimeoutInMinutes() {
long sessionTimeout = getSessionTimeout();
if (sessionTimeout > 0) {
sessionTimeout = Math.max(TimeUnit.SECONDS.toMinutes(sessionTimeout), 1L);
}
return sessionTimeout;
}
2、最终将SessionTimeout赋值给MaxInactiveInterval。终于完成session超时时间设置。
//以下代码
@Override
public void setContext(Context context) {
//省略其余设置代码,直接重新设置Session超时时间,此时又将上面的分钟单位转为秒。此时终于给Sesseion设置了默认超时时间。
if (this.context != null) {
setMaxInactiveInterval(this.context.getSessionTimeout() * 60);
this.context.addPropertyChangeListener(this);
}
}
三:如果自定义超时时间呢?
其实从上面的流程,已经不难看出,只需要在“org.springframework.boot.autoconfigure.web.ServerProperties”类中找到对应的Session参数,初始化让其加载上来即可完成设置。
/**
* Get the session timeout.
* @return the session timeout
* @deprecated since 1.3.0 in favor of {@code session.timeout}.
*/
@Deprecated
@DeprecatedConfigurationProperty(replacement = "server.session.timeout")
public Integer getSessionTimeout() {
return this.session.getTimeout();
}
所以在application中配置“server.session.timeout“即可,参数类型为long类型,单位为”秒“。
四:运行程序是如何判断session超时的?
其实很简单:只需要在每次本次同一个sessionequest请求的时间,和之前的请求时间进行比较,发现两个值的差已经大于MaxInactiveInterval的值即可。
//判断是否超时
@Override
public boolean isValid() {
//省略多个条件判断
if (maxInactiveInterval > 0) {
//判断此session空闲时间是否比maxInactiveInterval大,如果大的情况下,session就超时
int timeIdle = (int) (getIdleTimeInternal() / 1000L);
if (timeIdle >= maxInactiveInterval) {
expire(true);
}
}
return this.isValid;
}
//将上次访问时间和当前时间比较,拿到空闲时间值
@Override
public long getIdleTimeInternal() {
long timeNow = System.currentTimeMillis();
long timeIdle;
if (LAST_ACCESS_AT_START) {
timeIdle = timeNow - lastAccessedTime;
} else {
timeIdle = timeNow - thisAccessedTime;
}
return timeIdle;
}
说明:
所以为了保证session超时时间长点,可以在application配置文件中配置“server.session.timeout”参数即可,参数单位为“秒”,如果参数不是60的整数倍,会转换成60的整数倍(见二:系统如何设置超时时间、步骤二中的“1”中算法)。如不满一分钟,会转换为60秒。
扩展:
实际上也可以直接重写EmbeddedServletContainerCustomizer的customize方法进行赋值。
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer(){
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.setSessionTimeout(600);//单位为S
}
};
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# SpringBoot
# Session超时
# session超时原理
# Springboot2 session设置超时时间无效的解决
# 详解springmvc控制登录用户session失效后跳转登录页面
# springboot2中session超时
# 退到登录页面方式
# 加载
# 多个
# 类中
# 转换为
# 就会
# 只需
# 要在
# 也就是说
# 重写
# 配置文件
# 的是
# 都是
# 如何设置
# 情况下
# 是个
# 也会
# 在此
# 整数倍
# 没有任何
# 是怎么
相关文章:
股票网站制作软件,网上股票怎么开户?
淘宝制作网站有哪些,淘宝网官网主页?
宝塔面板创建网站无法访问?如何快速排查修复?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
设计网站制作公司有哪些,制作网页教程?
太平洋网站制作公司,网络用语太平洋是什么意思?
*服务器网站为何频现安全漏洞?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何自定义建站之星网站的导航菜单样式?
如何高效搭建专业期货交易平台网站?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
油猴 教程,油猴搜脚本为什么会网页无法显示?
自助网站制作软件,个人如何自助建网站?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
开封网站制作公司,网络用语开封是什么意思?
名字制作网站免费,所有小说网站的名字?
建站之星上传入口如何快速找到?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
创业网站制作流程,创业网站可靠吗?
太原网站制作公司有哪些,网约车营运证查询官网?
如何获取PHP WAP自助建站系统源码?
linux top下的 minerd 木马清除方法
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
python的本地网站制作,如何创建本地站点?
b2c电商网站制作流程,b2c水平综合的电商平台?
如何通过主机屋免费建站教程十分钟搭建网站?
如何在阿里云服务器自主搭建网站?
模具网站制作流程,如何找模具客户?
如何正确选择百度移动适配建站域名?
如何通过宝塔面板实现本地网站访问?
如何快速查询网址的建站时间与历史轨迹?
广德云建站网站建设方案与建站流程优化指南
网站专业制作公司有哪些,做一个公司网站要多少钱?
电商网站制作价格怎么算,网上拍卖流程以及规则?
建站之星导航菜单设置与功能模块配置全攻略
如何在腾讯云免费申请建站?
高端云建站费用究竟需要多少预算?
如何通过VPS搭建网站快速盈利?
Android使用GridView实现日历的简单功能
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
网站制作服务平台,有什么网站可以发布本地服务信息?
家庭建站与云服务器建站,如何选择更优?
在线制作视频网站免费,都有哪些好的动漫网站?
如何在宝塔面板中创建新站点?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
网站制作知乎推荐,想做自己的网站用什么工具比较好?
*请认真填写需求信息,我们会在24小时内与您取得联系。