Servlets HttpSession invalidate正在重定向到登录页面

Servlets HttpSession invalidate正在重定向到登录页面,servlets,servlet-filters,session-fixation,Servlets,Servlet Filters,Session Fixation,嗨,我正在使用servlet过滤器更改每个请求的会话ID,以避免会话固定。我的问题是当doFilter方法结束时,应用程序被重定向到登录页面。我只想使会话失效并创建新会话,而不重定向。我没有其他的过滤器 这是我的doFilter代码: HttpSession session= httpServletReq.getSession(); if(session!=null){ User u = session.getAttribute("user"); sessi

嗨,我正在使用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请求将创建到网络的新会话

更改每个请求的会话ID以避免会话固定

您应该这样做,而不是使会话无效。你可以用这个

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

chain.doFilter(request, response);
请注意,默认情况下会自动创建会话,因此它实际上不会返回
null
。您需要显式地将
false
传递给


也就是说,您不必对每个请求都执行此操作,只需在登录用户时执行即可。

感谢您的回答,如果我在使旧会话无效后删除getSession代码,如何将我的用户对象设置为“从请求创建新会话”?在这种情况下,您最好使用请求范围参数而不是会话。因为您希望使现有会话无效,所以这意味着您将不使用该会话。但是,您还需要维护用户数据。这种情况并不常见。因此,我建议如果您想要保留和使用用户数据,那么最好将用户数据保存在HttpServletRequest中(在您的示例中,是httpServletReq)