ngCookies为现有cookie返回undefined

时间:2015-04-20 03:12:29

标签: angularjs cookies angular-cookies

我已经在这个问题上摸不着头脑了好几个小时了,但仍未找到原因或解决方案。

基本上我有一个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也会出现同样的问题。

3 个答案:

答案 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');
}