使用Spring Session进行单页面应用的会话到期管理

时间:2015-09-18 09:15:14

标签: spring-session

我使用 Spring Session ,我遇到会话管理问题,尤其是处理会话过期问题。

想法是将自定义Http标头返回给客户端,例如如果会话已过期,则X-Application-Session-Is-New

以下是我提出的建议:

public class SessionDestroyedFilter extends OncePerRequestFilter {

    //TODO: not always invoked!!
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        if (isAjaxRequest(request) && (isRequestedSessionInvalid(request) || isSessionNew(request))) {
            response.addHeader("X-Application-Session-Is-New", "true");
        }
        filterChain.doFilter(request, response);
    }

    private boolean isRequestedSessionInvalid(HttpServletRequest request) {
        return !request.isRequestedSessionIdValid();
    }

    private boolean isSessionNew(HttpServletRequest request) {
        return request.getSession(false).isNew();
    }

    private boolean isAjaxRequest(HttpServletRequest request) {
        return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
    }
}

问题是我的过滤器在会话到期时似乎并不总是被调用,因为请求不是ajax请求,之后会立即创建新的会话ID。

任何人都可以请我指出一个适当的策略来处理单页应用的会话过期吗?

2 个答案:

答案 0 :(得分:1)

编辑目前无法进行以下操作(而是装饰) 以下是一些相关的github问题(评论它们以更快地修复它们)

https://github.com/spring-projects/spring-session/issues/243

https://github.com/spring-projects/spring-session/issues/112

要完成此操作,您必须使用自己的Challenge10

以下是使用HttpSessionStrategy(默认值)

的示例
CookieHttpSessionStrategy

如果您想在新会话中添加标题,还可以考虑覆盖 onNewSession(Session,HttpServletRequest,HttpServletResponse)

答案 1 :(得分:0)

这是错误的

请参阅我的其他答案

在处理完请求后,您应该移动逻辑以添加X-Application-Session-Is-New。 尝试像

这样的东西
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    filterChain.doFilter(request, response);
    if (isAjaxRequest(request) && (isRequestedSessionInvalid(request) || isSessionNew(request))) {
        response.addHeader("X-Application-Session-Is-New", "true");
    }
}