应用程序属性“server.servlet.session.timeout”在 Spring Boot 项目中不起作用

Posted

技术标签:

【中文标题】应用程序属性“server.servlet.session.timeout”在 Spring Boot 项目中不起作用【英文标题】:Application property "server.servlet.session.timeout" is not working in Spring Boot project 【发布时间】:2019-06-09 03:59:33 【问题描述】:

根据Spring Boot的文档,可以通过设置来配置会话超时

server.servlet.session.timeout= 300s

application.properties 文件中。在this post 和Spring Boot documentation 中也是这样说的。但不幸的是,这对我不起作用。

还有其他配置可以达到预期的效果吗?

【问题讨论】:

server.* 属性仅在您使用嵌入式容器时才有效。如果您要部署到 Tomcat,这些将无法正常工作,因为 Spring Boot 没有控制容器。 @M.Deinum,您能给我一些建议吗,如何在我当前在服务器上运行的项目中设置会话超时? 通过包含web.xmlweb-fragment.xml 并像您通常那样设置会话超时。 @M.Deinum,你能给我任何参考吗? 参考什么?只需检查如何在常规 Web 应用程序中设置会话超时。这也适用于此。 【参考方案1】:

你可以使用 方法一:

server.servlet.session.timeout=30s
server.servlet.session.cookie.max-age=30s

对我来说很好用

【讨论】:

根据春季最近的文档server.session.timeout 现在已弃用。您可以查看第一个链接 ok 如果你使用的是 spring boot 2.0 版,你可以使用 server.servlet.session.timeout。只需设置小时间,不要在这么长时间内执行任何活动并检查,我认为它应该可以工作 你有没有尝试过你的项目?实际上在我的项目server.session.timeout 这条线给出红色警报:/ 也将其设置为小于 1 分钟的值是行不通的。 tomcat 中的会话收割线程每分钟运行一次……因此,即使将其设置为更小的值也无法可靠地工作。 是在 server.servlet.session.cookie.max-age=30s 期间触发功能的任何方式,甚至被触发【参考方案2】:

此问题的一个可能原因可能是使用@EnableRedisHttpSession。正如answer 中所解释的:

通过使用@EnableRedisHttpSession,您告诉 Spring Boot 您希望完全控制基于 Redis 的 HTTP 会话的配置。结果,它的自动配置退出并且 server.servlet.session.timeout 没有效果。如果你想使用 server.servlet.session.timeout 那么你应该删除@EnableRedisHttpSession。或者,如果你想使用 @EnableRedisHttpSession 那么你应该使用 maxInactiveIntervalInSeconds 属性来配置会话超时。

希望这对某人有所帮助。

【讨论】:

【参考方案3】:

我发布答案是因为这种情况对我来说是新的。而且我还没有一步一步得到正确的解决方案。 根据M. Deinum 的建议,我在WEB-INF 文件夹下创建了一个web.xml 文件。项目结构是这样的

src
 |_ main
     |_ java
     |_ resources
     |_ webapp
         |_ WEB-INF
              |_ web.xml

而在web.xml我配置了<session-timeout>...</session-timeout>

我的web.xml 就像

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">


    <session-config>
        <session-timeout>5</session-timeout>
    </session-config>

</web-app>

现在我的 webapp 在服务器中的会话时间正在根据我的配置工作。感谢M. Deinum

【讨论】:

即使在 spring-boot 内部容器中也能正常工作吗?谢谢 如果您要部署到 Wildfly 或 JBOS App Server,您必须将 web.xml 文件重命名为 jboss-web.xml @peterzinho16 我没有尝试过 Wildfly 或 JBOS。所以不知道。【参考方案4】:

使用HttpSessionListener

server.servlet.session.timeout 仅适用于嵌入式容器。

@Configuration
public class MyHttpSessionListener implements HttpSessionListener 
    @Override
    public void sessionCreated(HttpSessionEvent event) 
        event.getSession().setMaxInactiveInterval(30);
    

【讨论】:

【参考方案5】:

spring doc 最新版本的 SpringBoot 使用了以下属性。

server.servlet.session.timeout=30m

【讨论】:

我已经提到过,我阅读了该文档但没有任何改变!【参考方案6】:

也许你添加了记住我。这将使会话始终有效。

【讨论】:

以上是关于应用程序属性“server.servlet.session.timeout”在 Spring Boot 项目中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何自动使用测试属性文件进行测试和源属性文件进行应用程序执行

Mapgis里怎样应用属性和结构功能

js高级程序设计——数据属性和访问器属性

为啥 layoutAttributesForItemAtIndexPath 中的属性属性没有被应用?

程序集,元数据,应用程序域,反射,特定属性

如何使用 Spring Boot 应用程序中另一个属性文件中的值解析属性文件中的占位符