在 Spring MVC 中设置会话超时

Posted

技术标签:

【中文标题】在 Spring MVC 中设置会话超时【英文标题】:setting session timeout in Spring MVC 【发布时间】:2012-08-18 10:34:21 【问题描述】:

有没有办法在 Spring 中指定会话超时? 我无法在 web.xml 中指定它。因为我在控制器中使用会话范围 bean,如下所示

我已经通过 spring xml 文件配置了控制器。

class xyzController

     ABCSessionScopeClass objectWhichWillBeStoredInSession;

我也不能用这个

session.setMaxInactiveInterval(60*60);

有没有其他方法可以做到这一点。我不介意为每个会话或同时为所有会话设置超时。

【问题讨论】:

我也想知道这一点。当我经历这个时,我可以改变它的唯一方法是在web.xml(或server.xml)中设置。 setMaxInactiveInterval 有什么问题,它不是 servlet API 的一部分吗?比如一些spring安全工具直接调用session.invalidate,没有问题。 @BorisTreukhov 这没有错。这是最后一个选项。我只是想确保是否有任何其他选择,例如在配置文件中指定或其他内容。 【参考方案1】:

使用Pure Spring MVC,sevlet context.xml的解决方案

<mvc:interceptors>
    <bean class="com.xxx.SessionHandler" />
</mvc:interceptors>

处理程序适配器

@Component
public class SessionHandler extends HandlerInterceptorAdapter 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 
        request.getSession().setMaxInactiveInterval(60*60);
        return true;
    

假设你使用的是spring security,

对于每次成功登录,我认为最好的方法是创建LoginSuccessHandler 并指定authentication-success-handler 用于正常登录以及remember-me。

@Service
public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler 
    @Override
    public void onAuthenticationSuccess(
            HttpServletRequest request,
            HttpServletResponse response,
            Authentication authentication) throws ServletException, IOException 
        request.getSession().setMaxInactiveInterval(60*60);
        super.onAuthenticationSuccess(request, response, authentication);
    


 

<http auto-config="true" use-expressions="true">
    <form-login login-page="/login"
        authentication-failure-url="/login.hst?error=true"
        **authentication-success-handler-ref="loginSucessHandler"** />
    <logout invalidate-session="true" logout-success-url="/home" logout-url="/logout" />
    <remember-me key="jbcp" **authentication-success-handler-ref="loginSucessHandler"**/>
    <session-management>
        <concurrency-control max-sessions="1" />
    </session-management>
</http>

【讨论】:

我没有使用 Spring 安全性。 如果你没有使用 spring security 那么你也可以使用 和 HandlerInterceptorAdapter。使用 Spring MVC。【参考方案2】:

我无法通过任何 Spring 配置文件找到任何方法来指定会话超时值。我正在使用&lt;aop:scoped-proxy&gt; bean,这样我就不必管理会话的读/写值/对象。现在,我也希望在不使用 servlets API 的情况下设置会话超时值。但看起来除了 web.xml 文件之外没有其他方法可以指定它。所以最终使用 servlet api request.getSession() 来设置超时时间。我将时间值外部化,以便无需重新编译代码即可轻松更改它。如果有人找到更好的方法,请随时发布。如果找到更好的答案,我可以接受。

【讨论】:

您可以使用 web.xml 指定会话超时,如下所述:***.com/questions/12932589/… 如果你使用的是Spring Boot,你可以在application.properties中指定会话超时时间:server.session-timeout=86400

以上是关于在 Spring MVC 中设置会话超时的主要内容,如果未能解决你的问题,请参考以下文章

如何在 web.config 中设置会话超时

在 Rails 3 中设置会话超时

如何在 Laravel 中设置会话超时?

如何在django中设置会话超时?

如何在 ASP.NET Core 的 web.config 中设置会话超时

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