SpringSecuriy

使用SpringSecurity退出登录之后做了session失效的方法,前端重定向到登录界面,然后再请求的时候会提示触发session过期,请问是什么原因呀~

该回答引用ChatGPT

这可能是因为您的应用程序在使用 Spring Security 进行身份验证时,仍然具有保留的会话信息或cookie信息,导致再次请求时仍然具有旧的 session id 或 cookie id。

为了彻底使 session 失效并清除任何相关的 cookie 信息,您可以在退出登录后,使用以下代码:


@RequestMapping("/logout")
public String logoutPage(HttpServletRequest request, HttpServletResponse response) {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth != null){    
        new SecurityContextLogoutHandler().logout(request, response, auth);
    }
    HttpSession session = request.getSession(false);
    if (session != null) {
        session.invalidate();
    }
    // 清除任何相关的cookie信息
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("JSESSIONID")) {
                cookie.setValue("");
                cookie.setPath("/");
                cookie.setMaxAge(0);
                response.addCookie(cookie);
                break;
            }
        }
    }
    return "redirect:/login";
}

该代码通过在后台手动清除 session 和 cookie 信息来确保用户完全退出登录状态。 在这种情况下,重新登录将创建一个新的 session 和 cookie,并避免了在新的请求中使用旧的 session 或 cookie。