Internet Explorer 10 忽略 XMLHttpRequest 'xhr.withCredentials = true'
Posted
技术标签:
【中文标题】Internet Explorer 10 忽略 XMLHttpRequest \'xhr.withCredentials = true\'【英文标题】:Internet Explorer 10 is ignoring XMLHttpRequest 'xhr.withCredentials = true'Internet Explorer 10 忽略 XMLHttpRequest 'xhr.withCredentials = true' 【发布时间】:2012-09-20 13:43:24 【问题描述】:我目前在使用 IE10 进行跨域 ajax 调用时遇到问题(在 IE10 模式下,不兼容)。
情况:
我有两个域,http://a
和 http://b
。我为http://b
设置了一个cookie。我目前在页面http://a
。
我想使用 XMLHttpRequest 向 http://b
发出 CORS 请求(根据 http://blogs.msdn.com/b/ie/archive/2012/02/09/cors-for-xhr-in-ie10.aspx 应该可以工作),并在请求中包含 cookie。
JS如下:
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://b', true);
xhr.withCredentials = true;
xhr.send();
这应该确保cookie附加到请求中;但是,Fiddler 跟踪显示没有附加 cookie,我得到401: Access Denied
。
服务器配置为使用 CORS,它包括 Access-Control 标头:
Access-Control-Allow-Origin: http://a
Access-Control-Allow-Credentials: true
(这应该没有什么区别,因为没有OPTIONS预检请求,并且IE发送的第一个请求是GET,并且cookie不存在,因此导致401)。
此外,JS sn-p 在 Firefox 和 Opera 中都可以正常工作。
【问题讨论】:
注意:我在使用 jQuery 时看到了相同的行为,xhrFields: withCredentials: true
我没有 IE10,但我有一个 CORS 测试站点。你能在IE10中尝试以下请求,看看它是否有效?只需单击“发送请求”按钮,然后查看响应是什么。我刚刚尝试过,它可以在 Chrome 中运行。如果它在 IE 中不起作用,则可能是一个错误:client.cors-api.appspot.com/…
@monsur - 我做了更多的测试。 IE10 在您提供的页面中工作,似乎 IE10 在具有匹配二级域名的页面上支持xhr.withCredentials
(例如http://a.b.com
与http://c.b.com
对话),但当二级域名不支持时不支持匹配(例如a.com 与b.com 交谈)
这可能是一个错误。您的 cookie 上的域是什么?请注意,b.com 设置的 cookie 只能由 b.com 访问。 a.com 上的 JS 代码看不到它。
是的,cookie 设置在域 http://b.com
上。当 withCredentials
设置为 true 时,Firefox 和 Opera 都包含 cookie,我还没有在 Chrome 和 Safari 上尝试过。
【参考方案1】:
这可能是相同的旧 IE P3P 问题。使用 IE 的默认设置,如果设置的 cookie 没有 P3P 标头也出现在响应中,则 cookie 被标记为“仅限第一方”。这意味着在第三方上下文中,例如 iframe 或 CORS 请求,IE 将拒绝发送 cookie。
要修复它,您需要在设置 cookie 时提供 P3P 标头。详情请见http://msdn.microsoft.com/en-us/library/ms537343%28v=vs.85%29.aspx。
更新:链接现已失效,但您可以在 the Internet Archive 看到它
【讨论】:
如果可以将答案更新为该标题的确切含义以节省浏览文档的时间,那就太好了:) 正确的标题取决于您网站的隐私政策。或者你可以像谷歌那样做(他们的标题目前是“p3p:CP =“这不是P3P政策!有关更多信息,请参阅google.com/support/accounts/bin/…。”) 由于链接中的 Microsoft 文章已被删除,能否请您更新答案,具体说明如何“在设置 cookie 时提供 P3P 标头”? @Anomie 添加一个值为 'CP="something"' 的 P3P 响应标头也解决了我在 Win7 上使用 IE11 的问题 这篇微软文章涵盖了这个主题,并且经常在类似情况下被引用:blogs.msdn.microsoft.com/ieinternals/2013/09/17/…【参考方案2】:我遇到了类似的问题,结果是浏览器设置阻止了第三方 Cookie(IE10 > Internet 选项 > 隐私 > 高级 > 第三方 Cookie > 接受)。为了解决这个问题,我勾选了“覆盖自动 cookie 处理”、“接受”(第三方 Cookie)和“始终允许会话 cookie”。
【讨论】:
我允许使用第三方 Cookie,但如果重复登录,这并不能解决问题。【参考方案3】:我们添加了一个标头 Vary : cookie,它起作用了..
【讨论】:
以上是关于Internet Explorer 10 忽略 XMLHttpRequest 'xhr.withCredentials = true'的主要内容,如果未能解决你的问题,请参考以下文章
本地文件(无服务器)上的 Internet Explorer“由于 mime 类型不匹配而忽略 CSS”
Internet Explorer 忽略 URL 中的 Hashtag
Internet Explorer CSS 属性“过滤器”忽略溢出:可见
Internet Explorer 8 忽略 CSS 中的字体粗细