我的网络应用程序是这样的,当用户登录服务器时,会在响应中添加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未被删除。刷新"资源"中的cookie列表Chrome开发者工具中的标签显示它仍然存在。重新加载登录页面并刷新"资源"中的cookie列表。选项卡仍然显示cookie。
为什么我不能从我的Javascript客户端删除cookie,因为它不是HTTPOnly cookie?它是导致问题的路径吗?不应该是,因为脚本正在cookie的路径中包含的页面上运行。 Cookies并不是很难正常处理,所以我很清楚可能有一些微不足道的东西我可以忽略 - 但是任何帮助都会非常感激。
更新
我在原帖中给了我的应用程序错误的路径。现在编辑它以反映正确的路径(好吧,抽象地)。事实证明,这是该问题的关键信息。 AngularJS使用应用程序的完整相对路径作为它创建/删除的所有cookie的路径属性,因为我们的服务器使用路径/myApp/
设置cookie,并且应用程序在{{1}的相对路径上运行Angular试图删除以前不存在的cookie(为了覆盖或删除现有的cookie,名称,域和路径都需要与创建cookie时使用的相同)。
答案 0 :(得分:11)
我想你应该检查服务器的响应 - 也许它们包含一个'set cookie'标题字段来设置cookie的值。
这是一个Plunker example,说明了如何添加/更改/删除/监视cookie的值(但没有可以更改cookie值的服务器端响应)。
但一般来说,$ cookies对象是一种“代理对象”,由AngularJS ngCookies模块双向跟踪,并且当浏览器的cookie被更改时,从一方改变其字段(因此您可以监视更改),但也会更改反映到浏览器的真实cookie中,因此您可以更改此对象。
因此,无法删除cookie的唯一原因是您在浏览器上删除它们,而服务器再次设置cookie,重新加载页面后它仍然存在。
答案 1 :(得分:5)
请注意要删除的Cookie的Cookie域。如果您正在使用多个子域(即一个用于静态资源,另一个用于api),则问题可能在于您尝试删除错误域的Cookie。
使用您选择的浏览器开发者工具查看您的Cookie。无论您为要删除的cookie设置了哪些域都存在问题,请在remove参数的options参数中指定它。
$cookies.remove('JSESSIONID', {domain: 'domain.tld'});
安全提示:通过Javascript删除会话ID并不会删除服务器上的会话。如果您的会话ID泄露,您可能会遇到会话固定。最好通过调用API中的注销端点来删除cookie,这样可以在服务器上完全清除会话,从而无法重复使用。
答案 2 :(得分:3)
您在更新中给出的答案似乎是正确的:Angular $cookieStore
只适用于路径值与当前路径相同的Cookie。
欺骗它的方法是使用this issue上的ajspera给出的解决方案:
<head>
<base href="/">
</head>
只需将<base href="/">
添加到HTML的head元素中,然后就可以了。
另一种解决方案是使用发送它的服务器设置cookie的路径。在Node.js Express中看起来像
res.cookie('specialCookie', 'special!', {path: '/myApp'});
请注意,对我来说,似乎$ cookieStore会删除尾部斜杠,因此您可能需要尝试两种方式。