我遇到了一个奇怪的ngCookies
服务问题。主要是,在收到来自我的/api/auth/login/
端点的响应后,带有标题:
Set-Cookie csrftoken=gxCld8gEga71MuQPQbjDujDBvR4HwPvu; expires=Sun, 28-Dec-2014 15:31:38 GMT; Max-Age=31449600; Path=/
在$cookies['csrftoken']
未指定的时间后更新。这一事实已记录在文档中:
Only a simple Object is exposed and by adding or removing properties to/from this object, new cookies are created/deleted at the end of current $eval.
知道这一点后,我求助于$timeout
希望将我的代码评估延迟到上述.$eval
最后得到以下(CoffeeScript):
login = () ->
deferred = $q.defer()
$http.post('/api/accounts/login/', data)
.success((data) ->
args = arguments
$timeout(() ->
do_fancy_stuff()
deferred.resolve.apply(deferred, args)
)
return
).error(() ->
args = arguments
$timeout(() ->
deferred.reject.apply(deferred, args)
)
return
)
promise = deferred.promise
promise.success = promise.then
promise.error = promise.catch
promise
但是上面的代码仍然存在这个问题。Cookie 会在启动后使用来自响应方式的值进行更新$timeout
。
console.log('cookies push', $browser.cookies().csrftoken, cookies.csrftoken);
在此处添加后(if
声明后)。我最终得到了这样的结果:
如您所见,在 7 次打印后,令牌相等。
yhQqT6KOfSKYCNB3Ag4sEPllMgkLrVj1
令牌来自上一个会话。我正在测试注销并进入应用程序而不刷新页面。Setting X-CSRFToken
直接在我的函数中do_fancy_stuff()
调用(没有异步的东西,只是裸$cookies['csrftoken']
访问)。
还$q
需要使用 来提供类似承诺作为返回值(如果 cookie 工作正常,$http
则不会有)。$q