【问题标题】:$cookies.get() gives undefined although document.cookie contains the value$cookies.get() 给出 undefined 尽管 document.cookie 包含值
【发布时间】:2017-10-27 16:27:16
【问题描述】:

在以下代码中,xsrfCookie有时未定义。我测量了大约 20% 的调用。

这似乎只发生在 MacOS Safari 和 iOS 的 Safari en Chrome 中。我正在使用 Angular 1.5.6。

$http.get('some_url')
  .success(function() {
    var xsrfCookie = $cookies.get('XSRF-TOKEN');
  });

在 xsrfCookie 之前或之后设置断点并记录 document.cookie 甚至 $cookies.get('XSRF-TOKEN') 始终显示预期的 XSRF 令牌。

我只能想象这与 GET 中的 XSRF 令牌被异步设置有关,与成功函数并行,但我在 angular.get() 代码中找不到任何暗示这一点的内容。

有人遇到过这个问题吗?

【问题讨论】:

  • 在您的第一个请求中,xsrf cookie 将永远不会存在。但在那之后,它会正常存在,因为它会随着这个 req 的响应和未来的进一步请求而重新调整
  • 在阅读时尝试暂停一秒钟
  • @Mouneer 谢谢,这就是我做 GET 以创建 XSRF 令牌的原因。在then 之后,我会做一个需要 XSRF 令牌的 POST。
  • @Mudassar 我会试试的,但我想知道为什么需要这样做。
  • @mdworld 对不起,我没有很好地阅读您的代码。另一个可能的原因:您为同一个 api 使用了两个域。例如,有时您使用 localhost,有时您使用您的 IP 地址,例如 192.168.1.100。因此,在一个域上设置的 cookie 将无法被另一个域访问

标签: javascript angularjs cookies safari mobile-safari


【解决方案1】:

到目前为止,我已经通过在超时中包装 cookie 的检索来解决这个问题:

$http.get('some_url')
  .success(function() {
    $timeout(function() {
      var xsrfCookie = $cookies.get('XSRF-TOKEN');
    }, 1);
  });

不幸的是,我无法找到为什么需要这样做(预计它可能与 AngularJS 1.5 摘要循环有关),但我确实发现了其他一些事情:

  • 原来的问题只出现在 iOS 和 MacOS 上的 Safari 中,而且只在某些时候出现。取决于环境(Intranet、Internet),但也每天都在变化,我有时会出现 100% 的故障率,有时会低至 10%。
  • 如果我在成功回调中将document.cookie 记录为第一件事,它也是空的(同样仅在 Safari 中,并且仅在某些情况下)
  • 可能$timeout 仅在摘要完成后触发,即使$timeout 没有毫秒参数也可以工作
  • onInit 这样的钩子只会在摘要周期完成后运行,但这个调用涉及到几个服务调用,我不明白这会如何涉及。

【讨论】:

    猜你喜欢
    • 2015-08-11
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2012-03-15
    • 2015-07-11
    • 2020-04-27
    相关资源
    最近更新 更多