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

Rob*_*her 7 cors angularjs

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

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

有可能拦截OPTIONS回应吗?如果我看到的只是一个404我无法区分"服务器关闭"和"没有这样的资源".

Cha*_*son 3

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

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

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