Spring Boot会话超时

时间:2015-01-23 05:53:25

标签: spring-boot

server.session-timeout似乎只适用于嵌入式tomcat。

我输入一个日志语句来检查会话最大间隔时间。在手动将war文件部署到tomcat之后,我意识到默认会话超时值(30分钟)仍在使用。

如何使用spring-boot设置会话超时值(不是针对嵌入式tomcat,而是针对独立应用程序服务器)?

7 个答案:

答案 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) {}

}