关于cookie无法删除的问题-java
今天在做一个用户退出demo的时候,发现无论怎么写都无法将存储username和password的cookie删除。
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还是没有删除成功,然后我查看请求头,果然cookie还是没能删除。
然后,我进一步检查持久化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是否设置了作用范围,根据作用范围来进行覆盖删除。