0

我使用Spring Session,并且在会话管理方面遇到问题,尤其是在处理会话到期时。

这个想法是向客户端返回一个自定义的 Http Header,例如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。

谁能给我指出一个适当的策略来处理单页应用程序上的会话过期?

4

2 回答 2

1

编辑以下目前是不可能的(而是做装饰)这里是一些相关的github问题(评论它们以更快地修复它们)

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

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

为此,您必须使用自己的HttpSessionStrategy.

这是一个示例,如果您正在使用CookieHttpSessionStrategy(默认示例)

public class CustomHttpSessionStrategy extends CookieHttpSessionStrategy {
    @Override
    public void onInvalidateSession(HttpServletRequest request, HttpServletResponse response) {
        super.onInvalidateSession(request, response);
        response.addHeader("X-Application-Session-Is-New", "true");
    }
}

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

于 2015-09-20T19:09:50.870 回答
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");
    }
}
于 2015-09-19T23:29:28.847 回答