17

我正在尝试使用凭据进行 CORS XHR 发布。它在 Chrome 中运行良好,但在 Firefox 中却不行。cookie 不存在于飞行前请求标头中,因此我看到 302。这在 Chrome 中非常有效,因为 cookie 位于飞行前请求标头中,并且随后的 POST 会通过。

为什么这在 FF 中不起作用?我错过了什么?

// assume url, boundEventHandler and uploadData are defined, as this definitely works in Chrome
var xhr = new XMLHttpRequest(); 
xhr.open("POST", url, true); 
xhr.addEventListener ("readystatechange", boundEventHandler, false); 
xhr.withCredentials = true;  // FWIW, I've also tried the string 'true'
xhr.send(uploadData);

有任何想法吗?我看到一些帖子说我可以在服务器端代理请求,但我更愿意根据 CORS 规范来让它工作。

谢谢!

4

2 回答 2

20

根据https://www.w3.org/TR/cors/#resource-preflight-requests的规范,预检请求从不包含 cookie。具体来说,规范说:

  • 排除用户凭据。

并链接到https://www.w3.org/TR/cors/#user-credentials说:

就本规范而言,术语用户凭据是指 cookie、HTTP 身份验证和客户端 SSL (...)。

也就是说,您上面引用的代码片段根本不应该涉及预检:没有上传事件侦听器,方法与简单方法一样,并且没有设置作者标头。因此,如果您真的看到预检请求,第一个问题是为什么会发生这种情况。您在 Firefox 中是否有任何扩展可能会修改您的 XMLHttpRequest 对象?

于 2012-04-13T04:47:11.620 回答
3

现在 Chromium(2014 年 7 月 4 日)不会发送带有预检请求的 cookie。 https://code.google.com/p/chromium/issues/detail?id=377541

于 2014-11-06T03:23:50.713 回答