服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Springboot2 session设置超时时间无效的解决

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

2021-09-24 11:55washingtin Java教程

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

问题:

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

解决方案:

  • server.*属性用于控制Spring Boot使用的嵌入式容器 。 Spring Boot将使用ServletWebServerFactory实例之一创建servlet容器的实例。 这些类使用server.*属性来配置受控的servlet容器(tomcat,jetty等)。
  • 当应用程序作为war文件部署到Tomcat实例时, server.*属性不适用。 它们不适用,因为可以使用预先配置的servlet容器(因为它是远程运行的服务)。 因此,部署到远程Tomcat将使server.*属性无用。

1. 按照网上给的帖子更改配置文件(如果是Jar启动生效) ,如下:

?
1
2
3
4
5
6
server:
  servlet:
    session:
      timeout: PT1H        # 1小时过期
      cookie:
        max-age: PT1H      # 1小时过期

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

扩展:Duration

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

?
1
2
3
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:

?
1
2
3
4
<Context path="/abtest" docBase="/abtest"
  defaultSessionTimeOut="3600" isWARExpanded="true"
  isWARValidated="false" isInvokerEnabled="true"
  isWorkDirPersistent="false"/>

2) 项目中更改web.xml:

?
1
2
3
<session-config
    <session-timeout>20</session-timeout
</session-config>

3)在程序中更改

?
1
session.setMaxInactiveInterval(30*60);

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

测试代码:

?
1
2
3
4
5
6
7
8
9
10
@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

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

原文链接:https://blog.csdn.net/washingtin/article/details/105601487

延伸 · 阅读

精彩推荐
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7472021-02-04
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17