我使用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。
谁能给我指出一个适当的策略来处理单页应用程序上的会话过期?