在春季 MVC 中设置会话超时

2022-09-02 13:15:09

有没有办法在春季指定会话超时?我无法在web.xml中指定它。由于我在控制器中使用会话范围Bean,如下所示

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

class xyzController{

     ABCSessionScopeClass objectWhichWillBeStoredInSession;
}

我也不能用这个

session.setMaxInactiveInterval(60*60);

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


答案 1

使用纯弹簧 MVC 的解决方案,sevlet 上下文.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;
    }
}

假设您正在使用弹簧安全性,

对于每个成功的登录,我认为最好的方法是创建和指定身份验证 - 成功 - 处理程序用于正常登录以及记住我。LoginSuccessHandler

@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>

答案 2

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


推荐