我已经在这个问题上摸不着头脑了好几个小时了,但仍未找到原因或解决方案。
基本上我有一个Angular.js前端尝试通过与后端中的身份验证API端点通信来记录用户(在Angular.js 1.3.15上使用ngCookies
)。成功后,我的代码应该将用户重定向到另一个页面。
因此登录代码如下所示:
auth.login($scope.user).success(function() {
$state.go('overview');
});
其中auth
是一种具有login
方法的服务,该方法只是向后端发送POST请求。 $state.go('overview')
将执行重定向。这段代码应该没问题,因为我从服务器返回HTTP200,因为我提供了正确的用户凭据。但是,浏览器不会将我重定向到概述页面,因为它仍然认为我没有登录,除非我刷新页面。
检查当前用户是否已登录的代码使用名为getToken()
的帮助方法,我使用ngCookies
来检索名为USER_SESSION
的cookie。这种方法是我认为问题所在。
方法本身就是
auth.getToken = function() {
return $cookies.USER_SESSION;
};
但即使浏览器中存在undefined
Cookie,它也会始终返回USER_SESSION
。
我做了一些测试(在远程测试服务器上,因此访问localhost
中的cookie不应该是一个问题):
auth.getToken = function() {
console.log($cookies);
console.log($cookies.USER_SESSION);
return $cookies.USER_SESSION;
}
console.log
的结果:
// Before login:
Object {...} // No USER_SESSION, this is good
undefined
// After hitting the login button, browser sends AJAX request,
// server returns HTTP200 response with Set-Cookie in the header:
Object {USER_SESSION: ""aa21fcd..."", ...} // UESR_SESSION exists, good
undefined // ???
// After refreshing the page:
Object {USER_SESSION: ""09b4tk..."", ...}
"09b4tk..."
这里的双引号问题是什么?我最初这么认为,但在刷新页面后,$cookies
返回相同的内容(相同的双引号但不同的USER_SESSION
值)并且$cookies.USER_SESSION
将具有正确的值,并且用户将是在概述页面上。
这是否意味着HTTP响应标头中的Set-Cookie
需要页面刷新才能生效?
谢谢!
P.S。 cookieStore
也会出现同样的问题。
答案 0 :(得分:1)
我有同样的问题,我无法用ngCookies解决这个问题。我决定使用本地存储。
我使用这个模块: https://github.com/grevory/angular-local-storage
而且,根据您展示的代码,本地存储将更适合您的应用。 请参阅:Local Storage vs Cookies
答案 1 :(得分:0)
因为界面已经改变了。你现在需要使用带有$ cookies的.get()和.set()。
$cookies.set('USER_SESSION', 'your value here');
auth.getToken = function() {
return $cookies.get('USER_SESSION');
}
答案 2 :(得分:0)
所以,我一直在和它搏斗一两天,因为我正在使用登录cookie。我在使用$cookieStore
时所使用的示例,现在自然已弃用,因此我很快切换到$cookies
,并认为是这样。
嗯,这就是事情。当您使用$cookies
时,请注意$cookies.put
和$cookies.putObject
之间存在差异,这一点非常重要。这自然适用于$cookies.get
和$cookies.getObject
。
我愚蠢地认为我的对象无论如何都会起作用,但不,结果是我最终获得了undefined
。
现在,对于您的问题,我将假设'USER_SESSION'
是一个对象,因此您正在遇到此问题。否则,你似乎也没有使用.put()或.get()。所以现在试试这个。
//if your cookie is an object
$cookies.putObject('USER_SESSION', cookieObject)
auth.getToken = function() {
return $cookies.getObject('USER_SESSION');
}
//if your cookie is not an object
$cookies.put('USER_SESSION', 'cookie')
auth.getToken = function() {
return $cookies.get('USER_SESSION');
}