此问题与跨源资源共享(CORS,http://www.w3.org/TR/cors/)有关。
如果在发出CORS请求时出错,Chrome(以及AFAIK其他浏览器)也会向错误控制台记录错误。示例消息可能如下所示:
XMLHttpRequest无法加载
http://domain2.example
。 Access-Control-Allow-Origin不允许原点http://domain1.example
。
我想知道是否有办法以编程方式获取此错误消息?我尝试在try / catch中包装xhr.send()
调用,我也尝试添加onerror()
事件处理程序。两者都没有收到错误消息。
答案 0 :(得分:30)
请参阅:
......以及关于CORS的XHR Level 2中的注释:
有意过滤信息。
几个月后编辑:此处的后续评论询问“为什么”;第一个链接中的锚点缺少一些字符,这使我很难看到我所指的文档的哪一部分。
这是一个安全问题 - 试图避免在可能敏感的HTTP标头中暴露信息。关于CORS的W3C链接说:
用户代理必须过滤除了那些简单响应标头之外的所有响应标头,或者其字段名称是对Access-Control-Expose-Headers标头的其中一个值的ASCII不区分大小写的匹配(如果在将响应头暴露给CORS API规范中定义的API之前,
该段落包含“简单响应标题”的链接,其中列出了Cache-Control,Content-Language,Content-Type,Expires,Last-Modified和Pragma。那些通过了。 “Access-Control-Expose-Headers标头”部分允许远程服务器通过在其中列出其他标头来公开其他标头。有关更多信息,请参阅W3C文档。
请记住,您有一个来源 - 假设您在浏览器中加载了网页,运行了一些JavaScript - 并且脚本正在向另一个来源发出请求,这通常不被允许,因为恶意软件可以做这样讨厌的东西。因此,运行脚本并代表它执行HTTP请求的浏览器充当网守。
浏览器查看来自“其他来源”服务器的响应,如果它似乎没有在CORS中“参与” - 所需的标题丢失或格式错误 - 那么我们处于“不”的位置信任。我们无法确定本地运行的脚本是否真诚地运行,因为它似乎试图联系那些不希望以这种方式联系的服务器。浏览器肯定不应该“泄漏”来自该远程服务器的任何敏感信息,只需将其整个响应传递给脚本而不进行过滤 - 这基本上是允许各种各样的跨源请求。将出现信息泄露漏洞。
这可能会使调试变得困难,但这是一种安全性与可用性之间的权衡,因为“用户”在这种情况下是开发人员,所以安全性具有很高的优先级。