2017-04-07 38 views
0

我们正面临着一个奇怪的cookie问题。服务器从一个端点返回下面像https://product.example.com/rest/v1/stuff使用iframe时,Set-Cookie似乎会损坏

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. 饼干被发送为id = 9b639ea0-e800-11e6-b3ee-002590812948; ID = c50b72c0-0b3a-11E7-b356-002590812948
  4. 饼干得到为ID = c50b72c0-0b3a-11E7-b356-002590812948发送

如果第一请求不使用正确的cookie,则下一组可能会发生变化并做不同的事情(加载页面后约50个HTTP调用,每个做4个列出的状态之一)

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

调试:

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

的Javascript:

我们使用反应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>; 
} 
+0

如果您不发布代码,您如何指望我们弄清楚您做错了什么? – Barmar

+0

我在您发布的代码中没有看到与Cookie相关的任何内容。 – Barmar

+0

http响应是什么设置Cookie – ekaqu

回答

0

是否有任何浏览器中,我们可以得到通知的任何更改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?

+0

“n您的代码,多个cookie值是使用一个Set-Cookie响应标头设置的,”我们在所有浏览器中看到,后端每个Set-Cookie返回一个Cookie键/值,只有其他字段是Cookie的路径和域名。 – ekaqu

+0

我试着用js脚本来检测cookie的变化,它从不做任何事情(添加控制台日志来显示更改)。 – ekaqu

+0

@ekaqu是'Set-Cookie'属性的'Version'和'Comment'部分吗?我在https://tools.ietf.org/html/rfc6265#section-4.1找不到任何相关信息。 – shaochuancs