问题:
今天项目中遇到了一个设置时间超时的问题,按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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持快网idc。
原文链接:https://blog.csdn.net/washingtin/article/details/105601487
相关文章
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-25 83
-
2025-05-25 66
-
2025-05-26 79
-
关于安装linux redhat后无法使用yum命令安装gcc-c++问题的解决过程
2025-05-27 54 -
2025-05-29 88

