我的网络应用程序是这样的,当用户登录服务器时,会在响应中添加一个 Set-Cookie 标头,如下所示:
Set-Cookie:JSESSIONID=1; Path=/myApp/; Secure
注销时,我尝试在客户端(浏览器)上删除此 cookie,因为只要删除 cookie,我就不关心会话是否在服务器上成功销毁。任何挥之不去的“幽灵”会话将不时在服务器上清理。
但是,我的应用无法删除 JSESSIONID cookie。假设从调用https://test.myserver.com/myApp/app/index.html#/mySubPage
注销函数并且注销函数执行以下操作:
delete $cookies["JSESSIONID"];
$location.path("/login");
cookie 没有被删除。刷新 Chrome 开发者工具中“资源”选项卡中的 cookie 列表显示它仍然存在。重新加载登录页面并刷新“资源”选项卡中列出的 cookie 仍会显示 cookie。
当它不是 HTTPOnly cookie 时,为什么我不能从我的 Javascript 客户端删除 cookie?是导致问题的路径吗?不应该,因为脚本在 cookie 路径中包含的页面上运行。通常处理 Cookie 并没有那么难,所以我很清楚我在这里可能忽略了一些微不足道的事情 - 但任何帮助将不胜感激。
更新:
我在原始帖子中给出了错误的应用程序路径。它现在被编辑以反映正确的路径(嗯,抽象地)。事实证明,这是该问题的关键信息。AngularJS 使用应用程序的完整相对路径作为它创建/删除的所有 cookie 的路径属性,因此由于我们的服务器将 cookie 设置为路径/myApp/
并且应用程序在相对路径上运行/myApp/app
,Angular 试图删除前者cookie,不存在(为了覆盖或删除现有的 cookie,名称、域和路径都需要与创建 cookie 时使用的相同)。