如何使用 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