是否有可能拦截对AngularJS中HTTP OPTIONS预检的响应?

时间:2014-02-04 16:07:08

标签: angularjs cors

我正在尝试实现一个简单的拦截器,它允许我在Angular应用程序中显示“无法联系服务器”的消息。但是,由于API位于不同的主机上,我正在处理CORS飞行前OPTIONS请求。

我发现如果API不可用,Chrome开发者工具会在503请求中显示OPTIONS,但Angular的$http拦截器会对后续版本捕获404个响应GET请求。我相信这是因为OPTIONS响应不包含所需的CORS标头,因此GET实际上从未执行过。

是否可以拦截OPTIONS响应?如果我看到的只是一个404我无法将“服务器关闭”与“没有这样的资源”区分开来。

1 个答案:

答案 0 :(得分:3)

您无法通过设计拦截此请求 - 浏览器正在“检查”您,确保您应该被允许提出请求。

我们使用了三种解决方案来解决这个问题:

  • 如果问题是您正在使用像NodeJS这样的开发环境,并且您的域名不匹配(也就是说,如果您通常不需要在生产中处理此问题),则可以使用代理。 https://github.com/substack/bouncy BounceJS NodeJS Module是一个易于使用的选项。然后,您的Web服务请求域将与您的页面所在的域匹配,并且不会触发检查。 (你也可以在制作中使用这样的技巧,虽然它很容易被滥用!)
  • 另外,对于临时使用,您可以使用类似Fiddler或Charles的方式通过伪造所需的标题来操纵请求,或者告诉浏览器不要检查它们( - Chrome中的--disable-web-security)。
  • 如果您在生产中遇到此问题,则需要合法地修复它(调整Web服务处理程序以添加所需的标题 - 只有两个),或者找到一种方法来以不会的方式发出请求t触发检查。例如,如果您同时控制源域和目标域,则可以在目标上放置一个脚本,以便向自己发出请求。无形地在IFRAME中运行它。然后你可以使用像postMessage()这样的东西来回沟通。像Facebook这样的大型服务出于同样的原因使用“XHR桥”。