不能使用AngularJS's $cookies删除cookie
Can't delete cookie with AngularJS's $cookies
我的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似乎去掉了尾随斜杠,所以您可能需要尝试两种方法。
- 使用php或javascript从facebook相册URL中删除多余的部分
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 如何删除多行HTML排列中的空白
- 如何从rails中的代码中删除新行( )
- 删除对HTML元素的拖动
- 当图像转换为本地存储的DataURL时,EXIF被删除
- 按顺序添加和删除类
- iframe正在添加标签,需要删除它们
- 如何在HTML输入字段中添加不可删除的后缀
- addData()从最新图表中删除.js 2.1.3-怎么了
- 如何覆盖锚点元素's href目标,并在我点击转到目标javascript时删除其他错误
- 删除CKEditor工具栏按钮,但不删除功能
- 当浏览器上的后退按钮到达主页时,我需要删除Class
- 正在删除node.js中已验证的网站
- 正在从页面中删除iframe
- 如何从 HTML 查询中删除项目
- JavaScript Cookies检查/设置/删除
- Cakephp: cookies删除后不再创建
- 如何避免$cookies被删除时刷新页面或更改窗口位置
- 不能使用AngularJS's $cookies删除cookie