3

我遇到了一个奇怪的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

4

2 回答 2

4

The solution I chose to use based on the information found here and here. Tells me that the $cookies will attempt to refresh every 100ms. So with this information in mind you can add a $timeout to any request that needs to use the response cookies.

        $http.post(url, tokens)
            .success(function(result, status, headers, config) { // sign in successful
                $timeout(function() { /* do stuff with $cookies here. */ }, 100);
            })
            .error(function(data, status, headers, config) {
            });
于 2014-01-15T19:12:51.577 回答
1

$cookies服务有一个pollerfn从 复制所有 cookie 的服务$browser,并且这个轮询器每 100 毫秒定期执行一次。所以最好放置 150 毫秒以$timeout避免边缘情况。

于 2018-03-15T04:17:57.497 回答