cookie的陷阱

问题简述

在做一个自动登录功能,登录的时候持久化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”,那么就设置cookiepath为“xxx/user”,而对cookie来说,name不是它的唯一标识,还包括domainpath,直接原因是删除的时候没有显示的指定path为“/”。

扩展阅读

Path的可见性

同一个domain下,当前请求只能读取到其uri的所有父类uricookie,“读取到”是什么概念呢,在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只有keyvalue,其他诸如domainmaxage等信息都丢失了,不是很明白其中的缘由,做个记录,如有高人路过指点就再好不过了。

猜你喜欢

转载自cantellow.iteye.com/blog/1152240