Springboot2 session设置超时时间无效怎么解决
问题:
今天项目中遇到了一个设置时间超时的问题,按SpringBoot2的application.properties更改一直不生效。
解决方案:
Spring Boot使用的嵌入式容器受server.*属性的控制。 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
以上是Springboot2 session设置超时时间无效怎么解决的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

一、Redis实现分布式锁原理为什么需要分布式锁在聊分布式锁之前,有必要先解释一下,为什么需要分布式锁。与分布式锁相对就的是单机锁,我们在写多线程程序时,避免同时操作一个共享变量产生数据问题,通常会使用一把锁来互斥以保证共享变量的正确性,其使用范围是在同一个进程中。如果换做是多个进程,需要同时操作一个共享资源,如何互斥呢?现在的业务应用通常是微服务架构,这也意味着一个应用会部署多个进程,多个进程如果需要修改MySQL中的同一行记录,为了避免操作乱序导致脏数据,此时就需要引入分布式锁了。想要实现分

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

springboot读取文件,打成jar包后访问不到最新开发出现一种情况,springboot打成jar包后读取不到文件,原因是打包之后,文件的虚拟路径是无效的,只能通过流去读取。文件在resources下publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

PHPSession跨域问题的解决方法在前后端分离的开发中,跨域请求已成为常态。在处理跨域问题时,我们通常会涉及到session的使用和管理。然而,由于浏览器的同源策略限制,跨域情况下默认情况下无法共享session。为了解决这个问题,我们需要采用一些技巧和方法来实现session的跨域共享。一、使用cookie跨域共享session最常

SpringBoot和SpringMVC都是Java开发中常用的框架,但它们之间有一些明显的差异。本文将探究这两个框架的特点和用途,并对它们的差异进行比较。首先,我们来了解一下SpringBoot。SpringBoot是由Pivotal团队开发的,它旨在简化基于Spring框架的应用程序的创建和部署。它提供了一种快速、轻量级的方式来构建独立的、可执行

1、自定义RedisTemplate1.1、RedisAPI默认序列化机制基于API的Redis缓存实现是使用RedisTemplate模板进行数据缓存操作的,这里打开RedisTemplate类,查看该类的源码信息publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations,BeanClassLoaderAware{//声明了key、value的各种序列化方式,初始值为空@NullableprivateRedisSe

在项目中,很多时候需要用到一些配置信息,这些信息在测试环境和生产环境下可能会有不同的配置,后面根据实际业务情况有可能还需要再做修改。我们不能将这些配置在代码中写死,最好是写到配置文件中,比如可以把这些信息写到application.yml文件中。那么,怎么在代码里获取或者使用这个地址呢?有2个方法。方法一:我们可以通过@Value注解的${key}即可获取配置文件(application.yml)中和key对应的value值,这个方法适用于微服务比较少的情形方法二:在实际项目中,遇到业务繁琐,逻

本文来写个详细的例子来说下dubbo+nacos+Spring Boot开发实战。本文不会讲述太多的理论的知识,会写一个最简单的例子来说明dubbo如何与nacos整合,快速搭建开发环境。
