首页 > 软件编程 > java > Springboot2 session时间无效

Springboot2 session设置超时时间无效的解决

作者:washingtin

这篇文章主要介绍了Springboot2 session设置超时时间无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

今天项目中遇到了一个设置时间超时的问题,按SpringBoot2的application.properties更改一直不生效。

解决方案:

  • server.*属性用于控制Spring Boot使用的嵌入式容器 。 Spring Boot将使用ServletWebServerFactory实例之一创建servlet容器的实例。 这些类使用server.*属性来配置受控的servlet容器(tomcat,jetty等)。
  • 当应用程序作为war文件部署到Tomcat实例时, server.*属性不适用。 它们不适用,因为可以使用预先配置的servlet容器(因为它是远程运行的服务)。 因此,部署到远程Tomcat将使server.*属性无用。
  • 1. 按照网上给的帖子更改配置文件(如果是Jar启动生效) ,如下:

    server: servlet: session: timeout: PT1H # 1小时过期 cookie: max-age: PT1H # 1小时过期

    说明:PT1H 意思是设置session失效的时间是1小时。

    扩展:Duration

    通过查看springboot源码发现setTimeouot方法,这里要求传入Duration的实例

    public void setTimeout(Duration timeout) { this.timeout = timeout;

    Duration是在Java8中新增的,主要用来计算日期差值,Duration是被final声明的,并且是线程安全的。

    如果转换字符串方式,类似于 SimpleDateFormat 的格式化日期方式

    Duration 字符串类似数字有正负之分:默认为正,负以'-'开头,下面紧接着'PT', 下面时间字母:

  • 'D' – 天
  • 'H' – 小时
  • 'M' – 分钟
  • 'S' – 秒
  • 每个单位都必须由数字开始,且时分秒顺序不能乱,比如:PT2H3M2S 等于 -PT-2H-3M-2S。

    2. 设置tomcat的session超时

    1)在tomcat的conf目录下,更改servler.xml:

    <Context path="/abtest" docBase="/abtest"   defaultSessionTimeOut="3600" isWARExpanded="true"   isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>

    2) 项目中更改web.xml:

    <session-config> <session-timeout>20</session-timeout> </session-config>

    3)在程序中更改

    session.setMaxInactiveInterval(30*60);

    当你遇到同样的问题时,请先看上面的红字,按顺序排查即可。

    测试代码:

    @RestController @RequestMapping("/valid-time") public class TestController { @GetMapping("/test") public String validTime(HttpServletRequest request, HttpServletResponse response) { HttpSession session = request.getSession(); int sessionTime = session.getMaxInactiveInterval(); return new StringBuilder("sessionTime=").append(sessionTime).toString();

    时间不同步导致Spring session失效的巨坑

    Linux服务器时间不同步导致Spring session失效的巨坑

    由于业务的需要,将原本单机环境转为集群式环境,为了不修改任务所以选择了spring session + redis作为session共享方案。

    确认技术方案之后就在网上巴拉巴拉的搜索一堆关于spring session的资料,看了一遍没有发现前人有任何躺坑后,开始着手。

    安装redis过程忽略。

    根据资料一步一步的将spring session加入工程,单节点情况项目成功跑起来,没有报错,session也成功的写入了redis。

    然后为了稳妥起见,又在自己电脑上安装了nginx,并部署了3个tomcat,一切看起来都那么完美,多个节点之间完成了session共享。

    到目前已经完成了所有前期准备,就差最后一步了。

    噩梦开始了……

    在线上将所有节点部署完成,然后打开浏览器顺利访问到应用,当然我们不能仅仅停留在看到页面完事的地步,怎么也要登录登录吧,于是……

    无数次的输入用户密码,提示登录成功,最终的结果还是被拒之门外,o(╥﹏╥)o

    接下来就是无数的填坑之旅

    看日志……

    看各种请求请求……

    怀疑spring session有BUG……

    甚至开启了远程DEBUG模式调试,终于在万能的DEBUG模式下看到,spring session的getSession的时候,如果获取到了session, 首先会判断此session有没有过期,比较的方式也很简单,就是获取当前系统时间去和session的过期时间进行比较,如果当前时间小于过期时间,则标识此session没有过期。 看到这里,瞬间有了一股醍醐灌顶之感,小宇宙终于在这里爆发了。

    尼玛—>获取的session全部是过期的,然后……然后……当然是赶紧跑去看服务器时间,于是……哭了o(╥﹏╥)o,原来尼玛是你坑了我……

    为了纪念这次躺坑之旅,特发此文

    另外顺便记录一下Linux服务器时间同步

    date命令:

    date :查看当前时间,结果如下:Tue Mar 4 01:36:45 CST 2017

    date -s 09:38:40 :设置当前时间,结果如下:Tue Mar 4 09:38:40 CST 2017

    ntpdate命令:

    ntpdate -u ntp.api.bz :网络时间同步命令

    ntp常用服务器:

    中国国家授时中心:210.72.145.44

    NTP服务器(上海) :ntp.api.bz

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
  • 一文详解如何通过Java实现SSL交互功能
    一文详解如何通过Java实现SSL交互功能
    2023-04-04
  • idea intellij快速修复if语句缺少大括号的问题
    idea intellij快速修复if语句缺少大括号的问题
    2023-04-04
  • Idea运行单个main方法,不编译整个工程的问题
    Idea运行单个main方法,不编译整个工程的问题
    2023-04-04
  • Java并发包工具类CountDownLatch的应用详解
    Java并发包工具类CountDownLatch的应用详解
    2023-04-04
  • Scala中如何中断循环详解
    Scala中如何中断循环详解
    2023-04-04
  • Java之如何正确地对包装类进行装箱与拆箱
    Java之如何正确地对包装类进行装箱与拆箱
    2023-04-04
  • Java多线程中Lock的使用小结
    Java多线程中Lock的使用小结
    2023-04-04
  • idea中方法、注释、导入类折叠或是展开的设置方法
    idea中方法、注释、导入类折叠或是展开的设置方法
    2023-04-04
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2023 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号