问题简述
在做一个自动登录功能,登录的时候持久化cookie(没有加密,仅供测试):
final Cookie cookie = new Cookie("user", user.getId());
cookie.setMaxAge(5 * 60);
cookie.setPath("/");
inv.getResponse().addCookie(cookie);
注销的时候删除cookie:
final Cookie c = new Cookie(cookie.getName(), null);
c.setMaxAge(0);
inv.getResponse().addCookie(c);
问题来了,此cookie根本没有被删除,也就是说注销根本不起作用。
直接原因
删除的时候没有设置path,默认的path跟当前的uri有关,也就是说如果注销的uri为“xxx/user/logout”,那么就设置cookie的path为“xxx/user”,而对cookie来说,name不是它的唯一标识,还包括domain和path,直接原因是删除的时候没有显示的指定path为“/”。
扩展阅读
Path的可见性
同一个domain下,当前请求只能读取到其uri的所有父类uri的cookie,“读取到”是什么概念呢,在servlet中就是说从request取出来的cookies存在你想要的cookie。比如path为“/”,那么所有domain下的uri都能读取到,如果path为“/lib”,那么只有“/lib/…”下面的uri能够读取到,如果path为“/lib/user”,那么uri为“/lib”的请求从request里取出来的cookie就不包含path为“/lib/user”的cookie,这就是path的可见性。
从cookie中只能取出key/value
在调试的时候,我发现从request里取出来的cookie只有key和value,其他诸如domain和maxage等信息都丢失了,不是很明白其中的缘由,做个记录,如有高人路过指点就再好不过了。