Joe*_*ale 15 javascript cookies session-cookies angularjs
我的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");
Run Code Online (Sandbox Code Playgroud)
cookie不会被删除.刷新Chrome开发者工具的"资源"标签中的Cookie列表显示它仍然存在.重新加载登录页面并刷新"资源"选项卡中的cookie列表仍显示cookie.
为什么我不能从我的Javascript客户端删除不是HTTPOnly cookie的cookie?是导致问题的路径吗?不应该,因为脚本在cookie的路径中包含的页面上运行.Cookie通常不是那么难以处理,所以我很清楚,我可能会忽略一些微不足道的东西 - 但是任何帮助都会非常感激.
更新:
我在原帖中给了我的应用程序错误的路径.现在编辑它以反映正确的路径(好吧,抽象地).事实证明,这是该问题的关键信息.AngularJS使用应用程序的完整相对路径作为它创建/删除的所有cookie的路径属性,因此我们的服务器使用路径设置cookie /myApp/并且应用程序在相对路径上运行/myApp/app,因此Angular试图删除前者cookie,不存在(为了覆盖或删除现有cookie,名称,域和路径都需要与创建cookie时使用的相同).
Val*_*nov 11
我想你应该检查来自服务器的响应 - 也许它们包含一个'set cookie'标题字段来设置cookie的值.
这是一个Plunker示例,说明了如何添加/更改/删除/监视cookie的值(但没有可以更改cookie值的服务器端响应).
但一般来说,$ cookies对象是一种"代理对象",由AngularJS ngCookies模块双向跟踪,并且当浏览器的cookie被更改时,从一方改变其字段(因此您可以监视更改),但是更改也反映到浏览器的真实cookie,因此您可以更改此对象.
因此,无法删除cookie的唯一原因是您在浏览器上删除它们,而服务器再次设置cookie,重新加载页面后它仍然存在.
请注意要删除的cookie的cookie域.如果您正在使用多个子域(即一个用于静态资源,另一个用于api),则问题可能在于您尝试删除错误域的cookie.
使用您选择的浏览器开发人员工具查看您的cookie.无论为要删除的cookie设置的域是否存在问题,请在remove方法的options参数中指定.
$cookies.remove('JSESSIONID', {domain: 'domain.tld'});
Run Code Online (Sandbox Code Playgroud)
安全提示:通过Javascript删除会话ID不会删除服务器上的会话.如果您的会话ID泄露,您可能会遇到会话固定.最好通过调用API中的注销端点来删除cookie,这样可以在服务器上完全清除会话,从而无法重新使用它.
| 归档时间: |
|
| 查看次数: |
31112 次 |
| 最近记录: |