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
因此,有两个问题:

  • 为什么应用程序远程属性超时值对本地不起作用
  • 为什么远程超时乘以10(属性有3m,但日志显示为1800s)

  • 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每分钟运行一次的会话无效线程<