HttpSession 无效正在重定向到登录页面

HttpSession invalidate is redirecting to login page

您好,我正在使用 servlet 过滤器更改每个请求的会话 ID,以避免会话固定。我的问题是当 doFilter 方法结束时,应用程序被重定向到登录页面。我只想使会话无效并创建新会话,而无需重定向。我没有任何其他过滤器。

有我的doFilter代码:

HttpSession session= httpServletReq.getSession();
    
if(session!=null){
  User u = session.getAttribute("user");
  session.invalidate();

  HttpSession newSession = httpServletReq.getSession(true);
  newSession.setAttribute("user", u);
}

chain.doFilter(req, resp);

过滤器的模式是***.xhtml**

为什么我会重定向到登录?

可以更改过滤器上的会话 ID 吗?

谢谢

你只需要方法 session.invalidate().

当您调用“session.invalidate()”时,现有会话将失效。

因此 servlet 请求将创建新的网络会话。

change session ID on every request in order to avoid session fixation

您应该完全这样做,而不是使会话无效。您可以为此使用 HttpServletRequest#changeSessionId()

HttpSession session = httpRequest.getSession(false);
    
if (session != null) {
    httpRequest.changeSessionId();
}

chain.doFilter(request, response);

请注意 HttpServletRequest#getSession() defaults to auto-creating the session, so it actually never returns null. You need to explicitly pass false to HttpServletRequest#getSession(boolean).

也就是说,您不一定需要对每个请求都执行此操作,仅在您登录用户时执行此操作就足够了。