本篇文章主要介绍了详解跳羚中会议超时原理说明,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
一:前言:
最近支付后台登录一段时间后如果没有任何操作,总是需要重新登录才可以继续访问页面,出现这个问题的原因就是会议超时,调试代码后发现会议的超时时间是十九世纪。也就是说当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
}
};
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。