【问题标题】:Set-Cookie seems to get corrupted when working with iframe使用 iframe 时,Set-Cookie 似乎已损坏
【发布时间】:2017-04-07 00:31:12
【问题描述】:

我们正面临一个关于 cookie 的奇怪问题。服务器从https://product.example.com/rest/v1/stuff等端点返回以下内容

Set-Cookie: id=c50b72c0-0b3a-11e7-b356-002590812948;Version=1;Comment="ID";Domain=.example.com;Path=/;HttpOnly

完成后,我们会创建一个 iframe,并且 iframe 中的所有请求都应该发送 cookie。当浏览器发出下一个请求(iframe ref)时,会发生以下几种情况之一

  1. 没有 cookie 被发送
  2. cookie 作为 id=9b639ea0-e800-11e6-b3ee-002590812948 发送
  3. cookie 作为 id=9b639ea0-e800-11e6-b3ee-002590812948 发送; id=c50b72c0-0b3a-11e7-b356-002590812948
  4. cookie 作为 id=c50b72c0-0b3a-11e7-b356-002590812948 发送

如果第一个请求确实使用了正确的 cookie,则下一组可能会有所不同并执行不同的操作(加载页面后大约 50 个 HTTP 调用,每个执行 4 个列出的状态之一)

我们看到它发生在 Chrome、Safari 和 Firefox 中。

调试:

这可能是一个应用程序问题,但我们还没有找到一种方法来调试设置 cookie 的内容。是否有任何浏览器可以通知我们对 cookie 状态的任何更改(来自 http 或 js)?

Javascript:

我们使用 react 14,这里是有问题的代码

发出网络请求

getUri(id)
  .then((uri) => {
    self.dispatch(uri.uri);
  })
  .catch((errorMessage) => {
     self.actions.idFailures(errorMessage)
  })

这里是getUri

getUri(id) {
return new Promise(function(resolve, reject) {
  let url = 'rest/stuff/' + id;
  request
    .get(url)
    .set('Accept', 'application/json')
    .end(function(err, result){
      if(err || !result){
        reject(Error(err.response.text));
      }
      else {
        resolve(JSON.parse(result.text));
      }
    });
});

},

设置 iframe

if(this.state.uri) {
  instance = <iframe src={this.state.uri} style={iFrameStyle}> </iframe>;
}

【问题讨论】:

  • 如果您不发布代码,您希望我们如何找出您做错了什么?
  • 我在您发布的代码中没有看到任何与 cookie 相关的内容。
  • http 响应是设置 cookie 的原因

标签: javascript rest http iframe cookies


【解决方案1】:

是否有任何浏览器可以通知我们对 cookie 状态的任何更改?

您可以编写一个计时器来定期检查 cookie 状态,并在 cookie 状态更改时在控制台中打印有用的信息。检查can i be notified of cookie changes in client side javascript 示例代码。以下代码将起作用:

var lastCookie = document.cookie;
var checkCookie = function() {
  var currentCookie = document.cookie;
  if (currentCookie != lastCookie) {
    console.log('cookie changed!');
    console.log('old cookie:');
    console.log(lastCookie);
    console.log('new cookie:');
    console.log(currentCookie);
    lastCookie = currentCookie;
  }
};

window.setInterval(checkCookie, 1000);

但是,cookie 的变化只有在代码执行后才能检测到,这意味着 HTML 文件响应的Set-Cookie 可能会丢失。

在您的代码中,使用一个 Set-Cookie 响应标头设置了多个 cookie 值,不建议这样做。检查Is it possible to set more than one cookie with a single Set-Cookie? 以了解先前的讨论。

【讨论】:

  • "在您的代码中,使用一个 Set-Cookie 响应标头设置多个 cookie 值,"我们在所有浏览器中看到后端为每个 Set-Cookie 返回一个 cookie 键/值,唯一的附加字段是 cookie 的路径和域之类的东西。
  • 我尝试了 js 脚本来检测 cookie 更改,但它从来没有做任何事情(添加控制台日志以显示更改)。
  • @ekaqu VersionCommentSet-Cookie 属性的一部分吗?我在tools.ietf.org/html/rfc6265#section-4.1没有找到任何相关信息
  • 对于“检测 js 脚本中的 cookie”,我附上了一个例子。它适用于我的本地环境。
猜你喜欢
  • 2013-05-23
  • 2020-03-18
  • 1970-01-01
  • 2021-12-10
  • 2016-05-27
  • 2013-07-07
  • 1970-01-01
  • 2018-02-24
  • 2016-12-15
相关资源
最近更新 更多