不能使用AngularJS's $cookies删除cookie

Can't delete cookie with AngularJS's $cookies

本文关键字:cookies 删除 cookie AngularJS 不能      更新时间:2023-09-26

我的web应用程序是这样做的,当用户登录服务器添加一个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。

为什么我不能删除cookie从我的Javascript客户端,当它不是一个HTTPOnly cookie?是路径造成了问题吗?不应该这样,因为脚本运行在cookie路径中包含的页面上。cookie通常并不是很难处理,所以我很清楚这里可能有一些我忽略了的小事,但是任何帮助都会非常感激。

更新:

我在最初的帖子中给了我的应用程序错误的路径。现在它被编辑以反映正确的路径(好吧,抽象地)。事实证明,这是这个问题的关键信息。AngularJS使用完整的应用相对路径的路径属性创建/删除所有cookie,既然我们的服务器设置cookie /myApp/路径和相对路径的应用程序是运行在/myApp/app,角是试图删除前的饼干,不存在(为了覆盖或删除现有的cookie的名称、域,和路径都需要相同的使用在创建cookie)。

我想你应该检查从服务器的响应-也许他们包括一个'set cookie'头字段设置cookie的值。

这是一个Plunker的例子,说明了如何添加/更改/删除/观察cookie的值(但没有服务器端响应可以改变cookie的值)。

但是一般来说,$cookies对象是一种"代理对象",它被AngularJS的ngCookies模块双向跟踪,当浏览器的cookies发生变化时,它的字段也会发生变化(所以你可以$watch查看变化),但是这些变化也会反映到浏览器的真实cookies中,所以你可以改变这个对象。

所以cookie不能被删除的唯一原因是你在浏览器上删除它们,服务器再次设置cookie,重新加载页面后它仍然存在

注意要删除的cookie的cookie域。如果你正在使用多个子域(即一个用于静态资源,另一个用于api),你的问题可能是你正在尝试删除错误域的cookie。

用你选择的浏览器开发者工具看看你的cookies。无论你想要删除的cookie的域名是什么,在remove方法的options参数中指定它。

$cookies.remove('JSESSIONID', {domain: 'domain.tld'});

安全提示:通过Javascript删除会话ID不会删除服务器上的会话。如果您的会话id泄漏,您可能会遭受会话固定。最好是通过调用API中的注销端点来删除cookie,这将完全清除服务器上的会话,以便它不能被重用。

你在更新中给出的答案似乎是正确的:Angular $cookieStore只能在路径值与当前路径相同的cookie上工作。

欺骗它的方法是使用ajspera给出的解决方案:

<head>
  <base href="/">
</head>

只需将<base href="/">添加到HTML的head元素中,此时它就可以工作了。

另一种解决方案是使用发送cookie的服务器设置cookie的路径。在Node.js Express中,它看起来像

res.cookie('specialCookie', 'special!', {path: '/myApp'});

请注意,对我来说,$cookieStore似乎去掉了尾随斜杠,所以您可能需要尝试两种方法。