クッキーの罠

1232 ワード


問題の概要


自動ログイン機能を作成し、ログイン時にクッキーを永続化します(暗号化されていません.テストのみ):
 
final Cookie cookie = new Cookie("user", user.getId());
cookie.setMaxAge(5 * 60);
cookie.setPath("/");
inv.getResponse().addCookie(cookie);

 
ログアウト時にクッキーを削除:
final Cookie c = new Cookie(cookie.getName(), null);
c.setMaxAge(0);
inv.getResponse().addCookie(c);

問題が発生しました.このクッキーは削除されていません.つまり、ログアウトはまったく役に立たないということです.

直接の原因


削除時にpathは設定されておらず、デフォルトのpathは現在のuriに関係している.すなわち、ログアウトしたuriが「xxx/user/logout」であれば、cookieのpathを「xxx/user」に設定し、cookieにとってnameはその一意の識別ではなく、domainとpathも含まれている.直接の原因は削除時に表示されなかった指定pathが「/」である.

拡張読書


Pathの可視性
同じdomainの下で、現在のリクエストはuriのすべての親クラスuriのクッキーしか読み込めません.「読み込まれた」とはどんな概念ですか.servletではrequestから取り出したクッキーに欲しいクッキーが存在します.例えばpathが「/」であれば、すべてのdomain下のuriが読み取れるが、pathが「/lib」であれば、「/lib/...」下のuriのみが読み取れる.pathが「/lib/user」であれば、uriが「/lib」である要求がrequestから取り出されたcookieにはpathが「/lib/user」であるcookieは含まれない.これがpathの可視性である.
クッキーからkey/valueしか取り出せません
デバッグの时、requestから取り出したクッキーはkeyとvalueだけで、他のdomainやmaxageなどの情报が失われていることに気づきました.その理由がよくわかりません.记录を作って、高い人が指导してくれればいいです.