问题:
今天项目中遇到了一个设置时间超时的问题,按SpringBoot2的更改一直不生效。
解决方案:
- 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) {
= timeout;
}
Duration是在Java8中新增的,主要用来计算日期差值,Duration是被final声明的,并且是线程安全的。
如果转换字符串方式,类似于 SimpleDateFormat 的格式化日期方式
Duration 字符串类似数字有正负之分:默认为正,负以'-'开头,下面紧接着'PT', 下面时间字母:
'D' – 天
'H' – 小时
'M' – 分钟
'S' – 秒
每个单位都必须由数字开始,且时分秒顺序不能乱,比如:PT2H3M2S 等于 -PT-2H-3M-2S。
2. 设置tomcat的session超时
1)在tomcat的conf目录下,更改:
<Context path="/abtest" docBase="/abtest"
defaultSessionTimeOut="3600" isWARExpanded="true"
isWARValidated="false" isInvokerEnabled="true"
isWorkDirPersistent="false"/>
2) 项目中更改:
<session-config>
<session-timeout>20</session-timeout>
</session-config>
3)在程序中更改
(30*60);
当你遇到同样的问题时,请先看上面的红字,按顺序排查即可。
测试代码:
@RestController
@RequestMapping("/valid-time")
public class TestController {
@GetMapping("/test")
public String validTime(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = ();
int sessionTime = ();
return new StringBuilder("sessionTime=").append(sessionTime).toString();
}
}