【发布时间】:2012-12-21 04:46:16
【问题描述】:
我的网络应用程序是这样的,当用户登录服务器时,会在响应中添加一个 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。
为什么我不能从我的 Javascript 客户端删除不是 HTTPOnly cookie 的 cookie?是导致问题的路径吗?不应该,因为脚本在 cookie 路径中包含的页面上运行。通常处理 Cookie 并没有那么难,所以我很清楚我在这里可能忽略了一些微不足道的事情 - 但任何帮助将不胜感激。
更新:
我在原始帖子中提供了错误的应用程序路径。它现在被编辑以反映正确的路径(嗯,抽象地)。事实证明,这是该问题的关键信息。 AngularJS 使用应用程序的完整相对路径作为它创建/删除的所有 cookie 的路径属性,因此由于我们的服务器将 cookie 设置为 /myApp/ 的路径,并且应用程序在 /myApp/app 的相对路径上运行,Angular试图删除以前不存在的 cookie(为了覆盖或删除现有 cookie,名称、域和路径都需要与创建 cookie 时使用的相同)。
【问题讨论】:
-
您的模块中是否包含 ngCookies?像 angular.module('myApp', ['ngCookies'])
-
是的。我可以毫无问题地读取cookie。我在任何地方都没有收到任何错误,即使它应该被删除,cookie 仍然保持不变。
-
你试过 $cookieStore.remove(key) 吗?
-
另外一件事,$scope.digest() 发生了吗?是什么触发了 cookie 删除?如果它来自外部角度,则必须使用 $scope.$apply() 来启动手表。如果您正在调试(Chrome/Firebug),请在 angular-cookies.js 的 push() 函数中设置断点(最好使用非缩小版)。
-
不久前遇到了完全相同的问题。似乎 $.cookies 只能访问它自己设置的 cookie。我的解决方案是设置相同的 cookie 路径并在 Angular 应用程序之外使用 jQuery cookie 清除它们。
标签: javascript cookies angularjs session-cookies