关于cookie无法删除的问题-java

  今天在做一个用户退出demo的时候,发现无论怎么写都无法将存储username和password的cookie删除。

关于cookie无法删除的问题-java关于cookie无法删除的问题-java

HttpSession session = request.getSession();
        //从session中将user删除
        session.removeAttribute("user");
        
        //将存储在客户端的cookie删除掉
        Cookie cookie_username = new Cookie("username", "");
        cookie_username.setMaxAge(0);
        Cookie cookie_password = new Cookie("password", "");
        cookie_password.setMaxAge(0);
        response.addCookie(cookie_username);
        response.addCookie(cookie_password);
        
        response.sendRedirect(request.getContextPath()+"/login.jsp");

(删除cookie的代码)

在debug的时,我觉应该是自动登陆的filter中的问题,于是改写了filter中的代码,让filter做了判断,如果是跳转登录和注册页面,就不进行自动登录。然后调试,发现注册界面和登陆界面确实没有了用户登陆信息。但是只要点击其他链接,马上就会登陆上用户信息。

关于cookie无法删除的问题-java

关于cookie无法删除的问题-java

这说明cookie还是没有删除成功,然后我查看请求头,果然cookie还是没能删除。

关于cookie无法删除的问题-java

然后,我进一步检查持久化cookie的代码,

Cookie cookie_username = new Cookie("username", username);
                Cookie cookie_password = new Cookie("password", password);
                cookie_username.setMaxAge(24 * 60 * 60);
                cookie_password.setMaxAge(24 * 60 * 60);
                cookie_username.setPath(request.getContextPath());
                cookie_password.setPath(request.getContextPath());
                response.addCookie(cookie_username);
                response.addCookie(cookie_password);

我发现我在持久化cookie时,为了图省事将cookie可见路径设置为了全局。

而我退出代码中虽然确实是清除cookie的代码,但cookie默认的作用范围是当前目录和当前目录的子目录,所以cookie并没有被真正覆盖。

加入这两行代码

cookie_username.setPath(request.getContextPath());

cookie_password.setPath(request.getContextPath());

问题解决。

结论 Cookie的作用范围:默认可以作用于当前目录及其子目录,但不能作用于当前目录的上一级目录。要删除cookie时,一定要先了解cookie是否设置了作用范围,根据作用范围来进行覆盖删除。