Spring boot spring引导中servlet的超时不正确
这是远程服务器属性:Spring boot spring引导中servlet的超时不正确,spring-boot,timeout,embedded-tomcat,Spring Boot,Timeout,Embedded Tomcat,这是远程服务器属性: server.servlet.session.timeout=3m LoggerService.logger.info("onAuthenticationSuccess sessionid: {}, getMaxInactiveInterval: {}, ipaddress: {}", session.getId(), session.getMaxInactiveInterval(), SecurityUtil.getIpAdd
server.servlet.session.timeout=3m
LoggerService.logger.info("onAuthenticationSuccess sessionid: {}, getMaxInactiveInterval: {}, ipaddress: {}",
session.getId(), session.getMaxInactiveInterval(), SecurityUtil.getIpAddress());
request.getSession(false).setMaxInactiveInterval(55);
LoggerService.logger.info("onAuthenticationSuccess sessionid: {}, getMaxInactiveInterval: {}, ipaddress: {}",
session.getId(), session.getMaxInactiveInterval(), SecurityUtil.getIpAddress());
与mylocal.properties相同
此外,我们还有如下配置:
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.invalidSessionUrl("/login?invalidSession")//dokunma
.maximumSessions(1)//
.maxSessionsPreventsLogin(true)//
.expiredUrl("/login?expired")
.sessionRegistry(sessionRegistry());
@Bean // Http Listener
public HttpSessionListener httpSessionListener() {
return new HttpSessionListener() {
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
if (session != null) {
LoggerService.logger.info("sessionCreated sessionid: {}, setMaxInactiveInterval: {}, ipaddress: {}",
session.getId(), session.getMaxInactiveInterval(), SecurityUtil.getIpAddress());
我们有这样一节课:
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.invalidSessionUrl("/login?invalidSession")//dokunma
.maximumSessions(1)//
.maxSessionsPreventsLogin(true)//
.expiredUrl("/login?expired")
.sessionRegistry(sessionRegistry());
@Bean // Http Listener
public HttpSessionListener httpSessionListener() {
return new HttpSessionListener() {
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
if (session != null) {
LoggerService.logger.info("sessionCreated sessionid: {}, setMaxInactiveInterval: {}, ipaddress: {}",
session.getId(), session.getMaxInactiveInterval(), SecurityUtil.getIpAddress());
我这样做是为了看内部时间
但在服务器上,我看到以下日志:
sessionCreated sessionid: 342E6139B2FE108D26537C9D684FBFF3, setMaxInactiveInterval: 1800, ipaddress: null
它必须是180,而不是1800。为什么会成倍增长
我们没有任何其他代码来设置这个。例如:
request.getSession(false).setMaxInactiveInterval(11);
我们没有这个。但如果我找不到任何解决方案,我会用这个
例如,对于remote,我改为:
server.servlet.session.timeout=44s
但我看到的是:
sessionCreated sessionid: 7C3573FE7B5FB6C8939DF8BF60B1B550, setMaxInactiveInterval: 1800, ipaddress: null
Tomcat9正在这样做
在本地计算机上,我使用该属性进行测试
所以
用于我的本地和远程服务器数据库配置
但这次:
sessionCreated sessionid: 747E6BF3DCD061DFF306325FE4FD76B6, getMaxInactiveInterval: 60, ipaddress: 0:0:0:0:0:0:0:1
747E6BF3DCD061DFF306325FE4FD76B6 0:0:0:0:0:0:0:1 Session Created
我做错了什么
在上一次测试中,我为本地但具有远程属性的成功处理程序添加了以下内容:
server.servlet.session.timeout=3m
LoggerService.logger.info("onAuthenticationSuccess sessionid: {}, getMaxInactiveInterval: {}, ipaddress: {}",
session.getId(), session.getMaxInactiveInterval(), SecurityUtil.getIpAddress());
request.getSession(false).setMaxInactiveInterval(55);
LoggerService.logger.info("onAuthenticationSuccess sessionid: {}, getMaxInactiveInterval: {}, ipaddress: {}",
session.getId(), session.getMaxInactiveInterval(), SecurityUtil.getIpAddress());
如果我输入用户名密码,我可以看到:
: onAuthenticationSuccess sessionid: F796EA6C54D8BCA239A36E02C4A7A030, getMaxInactiveInterval: 60, ipaddress: 0:0:0:0:0:0:0:1
: onAuthenticationSuccess sessionid: F796EA6C54D8BCA239A36E02C4A7A030, getMaxInactiveInterval: 55, ipaddress: 0:0:0:0:0:0:0:1
我也这样做了:
@Bean // Http Listener
public HttpSessionListener httpSessionListener() {
return new HttpSessionListener() {
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
if (session != null) {
LoggerService.logger.info("sessionCreated sessionid: {}, setMaxInactiveInterval: {}, ipaddress: {}",
session.getId(), session.getMaxInactiveInterval(), SecurityUtil.getIpAddress());
session.setMaxInactiveInterval(55);
LoggerService.logger.info("sessionCreated sessionid: {}, setMaxInactiveInterval: {}, ipaddress: {}",
session.getId(), session.getMaxInactiveInterval(), SecurityUtil.getIpAddress());
同样的道理:
sessionCreated sessionid: FFA7DC9A6558951F1CB790AD9D804F88, getMaxInactiveInterval: 60, ipaddress: null
sessionCreated sessionid: FFA7DC9A6558951F1CB790AD9D804F88, getMaxInactiveInterval: 55, ipaddress: null
FFA7DC9A6558951F1CB790AD9D804F88 0:0:0:0:0:0:0:1 Session Created
对于remote,我使用相同的代码进行了测试,它也工作了,但我不想通过编程进行设置
sessionCreated before sessionid: 38EC29F7C9C45B34D1FDF05B1F90DC3A, getMaxInactiveInterval: 1800, ipaddress: 192.ss
sessionCreated after sessionid: 38EC29F7C9C45B34D1FDF05B1F90DC3A, getMaxInactiveInterval: 180, ipaddress: 192.ss
因此,有两个问题:
server.*
属性用于控制Spring Boot使用的嵌入式容器。Spring Boot将使用一个ServletWebServerFactory
实例创建servlet容器的实例。这些类使用server.*
属性来配置受控servlet容器(tomcat、jetty等)
但是,当您将应用程序作为war
文件部署到Tomcat实例时,服务器。*
属性不适用。它们不适用,因为预配置的servlet容器可用(因为它是远程运行的服务)。因此,部署到远程Tomcat将使服务器。*
属性无用
关于会话超时,以分钟为单位。弹簧启动将启动,因此
44s
或55s
将自动转换为1分钟。将其设置为少于一分钟的值也没有多大意义,因为Tomcat会使会话失效,每分钟都有一个线程运行 服务器。*属性用于控制Spring Boot使用的嵌入式容器。Spring Boot将使用一个ServletWebServerFactory
实例创建servlet容器的实例。这些类使用server.*
属性来配置受控servlet容器(tomcat、jetty等)
但是,当您将应用程序作为war
文件部署到Tomcat实例时,服务器。*
属性不适用。它们不适用,因为预配置的servlet容器可用(因为它是远程运行的服务)。因此,部署到远程Tomcat将使服务器。*
属性无用
关于会话超时,以分钟为单位。弹簧启动将启动,因此
44s
或55s
将自动转换为1分钟。将其设置为少于一分钟的值也没有多大意义,因为Tomcat会使会话失效,每分钟都有一个线程运行 无法更改远程服务器的会话超时,服务器。*
属性仅适用于本地嵌入式服务器。另外,tomcat上的间隔不能小于一分钟,因为tomcat的会话失效线程每分钟运行一次,因此将会话超时设置为小于一分钟是没有意义的。此外,您的安全配置不会影响会话超时,因此将其添加到问题中不会添加任何其他信息。@M.Deinum但在远程,它正在安全配置中进行编程?是的,这将起作用,因为您随后会为每个会话设置它,而不是为服务器全局设置。这不是配置,它只是会话创建时执行的代码的一部分,这与全局配置服务器不同<作为tomcat每分钟运行一次的会话无效线程在tomcat上,它不会每分钟失效一次。我得等1800秒这与全局配置服务器不同那我该怎么办?为什么春天不能这样做?也许docker而不是tomcat可以更好地工作?因为Spring无法控制外部配置的服务器!令人惊讶的是,您的操作团队设置了一台服务器,您部署了应用程序,突然,精确配置的服务器突然将所有会话超时切换到3分钟。只是因为您决定这样做(这会影响部署在该服务器上的所有应用程序)。是的,您必须等待1800秒,但是检查会话是否超时的线程每分钟运行一次!。因此,将其设置为较小的值(正如您对44s示例所做的那样)是非常无用的,这就是为什么spring boot会切换这几分钟。您无法更改远程服务器的会话超时,服务器。*
属性仅适用于本地嵌入式服务器。另外,tomcat上的间隔不能小于一分钟,因为tomcat的会话失效线程每分钟运行一次,因此将会话超时设置为小于一分钟是没有意义的。此外,您的安全配置不会影响会话超时,因此将其添加到问题中不会添加任何其他信息。@M.Deinum但在远程,它正在安全配置中进行编程?是的,这将起作用,因为您随后会为每个会话设置它,而不是为服务器全局设置。这不是配置,它只是会话创建时执行的代码的一部分,这与全局配置服务器不同<代码>在tomcat上作为tomcat每分钟运行一次的会话无效线程<