如何使用 Spring Boot 嵌入式 tomcat 设置会话超时

Posted

技术标签:

【中文标题】如何使用 Spring Boot 嵌入式 tomcat 设置会话超时【英文标题】:How to set session timeout with spring boot embedded tomcat 【发布时间】:2016-12-03 00:51:31 【问题描述】:

我无法在我的 Jhipster WebApp 中设置会话超时(spring boot + Spring security + angularJS)

我只是做了最简单的方法:

...
/**
 * Configuration of web application with Servlet 3.0 APIs.
 */
@Configuration
public class WebConfigurer implements ServletContextInitializer, EmbeddedServletContainerCustomizer

 ....
@Inject
    private ServerProperties serverProperties;
....
/**
     * Set up Mime types.
     */
    @Override
    public void customize(ConfigurableEmbeddedServletContainer container)
    
        MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
        // IE issue, see https://github.com/jhipster/generator-jhipster/pull/711
        mappings.add("html", "text/html;charset=utf-8");
        // CloudFoundry issue, see https://github.com/cloudfoundry/gorouter/issues/64
        mappings.add("json", "text/html;charset=utf-8");
        container.setSessionTimeout(serverProperties.getSession().getTimeout(), TimeUnit.MINUTES);
        log.info("SessionTimeout = ", serverProperties.getSession().getTimeout());
        container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/login"));
        container.setMimeMappings(mappings);
    
...

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties

    private Session session = new Session();

    public static class Session
    
        private int timeout = 6;

        public int getTimeout()
        
            return timeout;
        

        public void setTimeout(int timeout)
        
            this.timeout = timeout;
        

    

    public Session getSession()
    
        return session;
    

    public void setSession(Session session)
    
        this.session = session;
    


Application.yml

server:
    port: 8080
    session:
      timeout: 1 

日志通知会话长度为 1 分钟:

2016-07-28 16:17:03.103  INFO 6248 --- [  restartedMain] com.tess2i.config.WebConfigurer          : SessionTimeout = 1   

启动WebApp后,我登录了WebApp,然后等了1分钟多。然后我点击某处查询服务器。一切仍在工作。没有会话错误/重定向。

还有什么需要做的?

【问题讨论】:

不需要您的自定义实现 - 默认使用 server.session.timeout 属性。你确定你没有使用 JWT 身份验证吗?还是启用了记住我功能? 根据文档,该属性的单位是秒。 server.session.timeout = #会话超时以秒为单位。 docs.spring.io/spring-boot/docs/current/reference/html/… 【参考方案1】:

首先,您不需要提供任何自定义实现,设置server.session.timeout 应该通过开箱即用的Spring Boot 支持,请参阅the official documentation 了解更多详细信息。

就超时和重定向而言,您确定您没有使用 remember-me 或 JWT 身份验证或其他不依赖 HTTP 会话及其到期的身份验证方法吗?

【讨论】:

是的,你是对的,在 jhispter 中有一个记住我的身份验证。但我只是像这样添加了令牌有效性: http.csrf().and().addFilterAfter(new CsrfCookieGeneratorFilter(), CsrfFilter.class).exceptionHandling() .accessDeniedHandler(new CustomAccessDeniedHandler()).authenticationEntryPoint(authenticationEntryPoint) .and ().rememberMe() .rememberMeServices(rememberMeServices).rememberMeParameter("remember-me").tokenValiditySeconds(10).key(env.getProperty("jhipster.security.rememberme.key")).and() 。 .....但没有任何改变 嗯,这完全是一个不同的问题,与当前问题无关 - 您能否针对该场景打开另一个问题并提供更详细的代码示例?对于这个问题,我建议您禁用记住我的身份验证并验证会话超时是否有效。

以上是关于如何使用 Spring Boot 嵌入式 tomcat 设置会话超时的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 gradle 的多个嵌入式服务器运行 spring-boot 集成测试

如何使用 Spring Boot 嵌入式 tomcat 设置会话超时

如何在 Spring Boot 集成测试中使用嵌入式 MongoDB

如何禁用嵌入式数据库 Spring-boot spring-data-jpa

如何使用 Spring Boot 和嵌入式 Tomcat 配置此属性?

如何使用Spring Boot和嵌入式Tomcat配置此属性?