0

您好我正在使用 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 吗?

谢谢

4

2 回答 2

1

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

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

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

chain.doFilter(request, response);

请注意,HttpServletRequest#getSession()默认为自动创建会话,因此它实际上永远不会返回null。您需要明确传递falseHttpServletRequest#getSession(boolean).

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

于 2021-02-05T04:42:06.133 回答
0

你只需要方法session.invalidate()

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

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

于 2021-02-05T01:42:30.547 回答