是否有可能捕获CORS错误?

这个问题涉及跨源资源共享(CORS, http://www.w3.org/TR/cors/ )。

如果在发出CORS请求时发生错误,则Chrome(以及AFAIK其他浏览器)会将错误logging到错误控制台。 示例消息可能如下所示:

XMLHttpRequest无法加载http://domain2.example 。 Access-Control-Allow-Origin不允许原始http://domain1.example

我想知道是否有一种方法来编程方式获取此错误信息? 我已经尝试在try / catch中包装我的xhr.send()调用,我也尝试添加一个onerror()事件处理程序。 两者都没有收到错误信息。

看到:

…以及XHR 2级关于CORS的注释:

这些信息是有意过滤的。

几个月后编辑:这里的后续评论要求“为什么”; 在第一个链接的锚是缺less一些字符,这使得很难看到我指的文件的哪一部分。

这是一个安全的事情 – 试图避免暴露HTTP标头中的信息,这可能是敏感的。 关于CORS的W3C链接说:

用户代理必须过滤除了那些简单的响应头以外的所有响应头,或者对于Access-Control-Expose-Headers头(如果有的话)的值之一,字段名是ASCII大小写不敏感的匹配。在将响应头文件暴露给CORS API规范中定义的API之前。

该段包含“简单响应头”的链接,其中列出了caching控制,内容语言,内容types,过期,最后修改和附注。 所以那些通过。 “Access-Control-Expose-Headers标题”部分让远程服务器通过列出其他标题来显示其他标题。 请参阅W3C文档以获取更多信息。

请记住,你有一个起源 – 比方说,这是你的浏览器中加载的网页,运行一些JavaScript – 脚本正在向另一个来源提出请求,这通常是不允许的,因为恶意软件可以做一些令人讨厌的事情办法。 因此,运行脚本并代表其执行HTTP请求的浏览器充当守门人。

浏览器查看来自“其他来源”服务器的响应,如果它似乎不是“参与”在CORS – 所需的标题丢失或格式不正确 – 那么我们处于一个不信任的地位。 我们不能确定在本地运行的脚本是否真诚行事,因为它似乎试图联系那些不希望以这种方式联系的服务器。 浏览器当然不应该通过将其整个响应传递给脚本来“泄漏”来自该远程服务器的任何敏感信息 – 这基本上会允许一个交叉源请求。 信息披露漏洞会出现。

这可能会使debugging变得困难,但这是一个安全与可用性的折衷,因为“用户”是这方面的开发人员,所以安全性是重中之重。