server.session-timeout
似乎只适用于嵌入式tomcat。
我输入一个日志语句来检查会话最大间隔时间。在手动将war文件部署到tomcat之后,我意识到默认会话超时值(30分钟)仍在使用。
如何使用spring-boot设置会话超时值(不是针对嵌入式tomcat,而是针对独立应用程序服务器)?
答案 0 :(得分:21)
以防有人发现这个有用:
如果您正在使用Spring Security,则可以扩展SimpleUrlAuthenticationSuccessHandler类并在身份验证成功处理程序中设置会话超时:
public class NoRedirectSavedRequestAwareAuthenticationSuccessHandler
extends SimpleUrlAuthenticationSuccessHandler {
public final Integer SESSION_TIMEOUT_IN_SECONDS = 60 * 30;
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws ServletException, IOException {
request.getSession().setMaxInactiveInterval(SESSION_TIMEOUT_IN_SECONDS);
// ...
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginProcessingUrl("/login")
.successHandler(new NoRedirectSavedRequestAwareAuthenticationSuccessHandler())
.failureHandler(new SimpleUrlAuthenticationFailureHandler())
.and().httpBasic();
}
}
答案 1 :(得分:6)
将Spring Boot应用程序部署到独立服务器时,配置会话超时的方式与在任何其他war部署中的方式相同。
对于Tomcat,您可以通过在maxInactiveInterval
中的manager元素上配置server.xml
属性或使用web.xml中的session-timeout
元素来设置会话超时。请注意,第一个选项将影响部署到Tomcat实例的每个应用程序。
答案 2 :(得分:2)
您已经发现,在Servlet API中没有直接调用,也没有用于设置会话超时的Spring API。这里和那里讨论了对它的需求,但它还没有得到解决。
有一种圆润的方式来做你想做的事。您可以配置会话侦听器,以设置会话的超时。我在http://fruzenshtein.com/spring-java-configuration-session-timeout
上看到了一篇包含代码示例的文章我希望有所帮助。
答案 3 :(得分:0)
在你的application.properties
中#session timeout (in secs for spring, in minutes for tomcat server/container)
server.session.timeout=1
我测试了它并且正在工作! 事实证明,tomcat会在几分钟内获取该属性
答案 4 :(得分:0)
基于贾斯汀的答案,该答案显示了如何使用AuthenticationSuccessHandler
和Spring Security来设置会话超时,我创建了SessionTimeoutAuthSuccessHandler
:
public class SessionTimeoutAuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
public final Duration sessionTimeout;
public SessionTimeoutAuthSuccessHandler(Duration sessionTimeout) {
this.sessionTimeout = sessionTimeout;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication auth) throws ServletException, IOException {
req.getSession().setMaxInactiveInterval(Math.toIntExact(sessionTimeout.getSeconds()));
super.onAuthenticationSuccess(req, res, auth);
}
}
使用中:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().formLogin().loginPage("/login")
.successHandler(new SessionTimeoutAuthSuccessHandler(Duration.ofHours(8))).permitAll()
.and().logout().logoutUrl("/logout").permitAll();
}
...
}
编辑,从SavedRequestAwareAuthenticationSuccessHandler
而非SimpleUrlAuthenticationSuccessHandler
扩展以确保原始请求在重新认证后不会丢失。
答案 5 :(得分:0)
使用HttpSessionListener
@Configuration
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
event.getSession().setMaxInactiveInterval(30);
}
}
答案 6 :(得分:0)
作为@Ali答案的补充,您还可以在session.timeout
文件中创建一个application.yml
变量,并在您的班级中使用它。这在Spring Boot战争和外部Tomcat上应该可以很好地工作:
application.yml
session:
timeout: 480 # minutes
SessionListener(带有@Configuration
注释)
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
class SessionListener implements HttpSessionListener {
@Value("${session.timeout}")
private Integer sessionTimeout;
@Override
public void sessionCreated(HttpSessionEvent event) {
event.getSession().setMaxInactiveInterval(sessionTimeout);
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {}
}