SpringBoot设置Session失效时间的解决方案
作者:一觉睡到小时候
当过期时间是大于1分钟的时候是没有什么问题的,但是如果设置过期时间小于1分钟,就会失效,这篇文章主要介绍了SpringBoot设置Session失效时间的解决方案,需要的朋友可以参考下
springboot的yml文件中设置session的过期时间
#Session超时时间设置,单位是秒,默认是30分钟 servlet: session: timeout: 3600s
当过期时间是大于1分钟的时候是没有什么问题的,但是如果设置过期时间小于1分钟,就会失效。
servlet: session: timeout: 10
因为SpringBoot在TomcatServletWebServerFactory
为session的过期时间做了优化。
Session的配置configureSession
private void configureSession(Context context) { long sessionTimeout = this.getSessionTimeoutInMinutes(); context.setSessionTimeout((int)sessionTimeout); Boolean httpOnly = this.getSession().getCookie().getHttpOnly(); if (httpOnly != null) { context.setUseHttpOnly(httpOnly); } if (this.getSession().isPersistent()) { Manager manager = context.getManager(); if (manager == null) { manager = new StandardManager(); context.setManager((Manager)manager); } this.configurePersistSession((Manager)manager); } else { context.addLifecycleListener(new TomcatServletWebServerFactory.DisablePersistSessionListener()); } }
我们看到long sessionTimeout = this.getSessionTimeoutInMinutes();
过期时间取自getSessionTimeoutInMinutes
方法。
private long getSessionTimeoutInMinutes() { Duration sessionTimeout = this.getSession().getTimeout(); return this.isZeroOrLess(sessionTimeout) ? 0L : Math.max(sessionTimeout.toMinutes(), 1L); }
在这里对sessionTimeout
进行判断,首先判断是否为0或者更少isZeroOrLess
方法
private boolean isZeroOrLess(Duration sessionTimeout) { return sessionTimeout == null || sessionTimeout.isNegative() || sessionTimeout.isZero(); }
将sessionTimeout
转换为分钟sessionTimeout.toMinutes()
public long toMinutes() { return seconds / SECONDS_PER_MINUTE; } /** * Seconds per minute. */ static final int SECONDS_PER_MINUTE = 60;
将转换后的值和1L进行比较
public static long max(long a, long b) { return (a >= b) ? a : b; }
如果该值小于1分钟,则按1分钟算。
最后返回的是三目运算的结果。
到此这篇关于SpringBoot设置Session失效时间的文章就介绍到这了,更多相关SpringBoot设置Session失效时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!