【问题标题】:Angular force disable CORS角力禁用 CORS
【发布时间】:2014-04-08 17:22:00
【问题描述】:

如果我们在 ajax(使用 $http)的另一个域上设置一些自定义标头,我已经看到 Angular(1.2.17)正在发送一个 OPTION 请求。 我知道这是某处 RFC 的一部分(无需指出),但无论如何我都会强制发送实际请求,因为用户将在非洲某处的 3G 网络后面(你猜 OPTION 标头不会工作)。

所以问题肯定出在客户端,因为 $.ajax 有效,而不是 $http。 我已经在这个问题上看到了 stackoverflow 中的其他线程,但我不想配置服务器端,我想在客户端以角度禁用它。 (请不要建议这个)。

我见过的 useXDomain 选项什么都不做, domainWhiteList 的事情也不起作用。 有没有办法完全禁用这个东西? (或者我将不得不使用 jquery 代替 ajax 部分)。

【问题讨论】:

  • 是 Firefox 还是只有 chrome?
  • 我在发布问题后 10 分钟就找到了答案,我处理了这个问题一整天......所以显然这确实是直接在浏览器中实现的,也是 JQuery 的原因工作是因为它没有自定义标头(并且“授权”似乎是自定义标头的一部分,这就是角度请求失败的原因)。这里唯一的解决方案是为请求创建一个代理以在同一个域上......
  • 由于某些原因,它似乎适用于 chrome 上的空 POST

标签: ajax angularjs cors


【解决方案1】:

不是 AngularJS 直接执行 OPTION 请求,而是由 XHR 完成。可以查看the AngularJS source,AngularJS 没有显式执行 OPTION 请求。

根据MDN,XHR 在以下情况下首先执行 OPTION 请求:

  • 它使用 GET、HEAD 或 POST 以外的方法。此外,如果 POST 用于发送 Content-Type 以外的请求数据 application/x-www-form-urlencoded、multipart/form-data 或 text/plain, 例如如果 POST 请求使用 application/xml 或 text/xml,然后预检请求。
  • 它在请求中设置自定义标头(例如,请求使用诸如 X-PINGOTHER 之类的标头)

我注意到 AngularJS 将 POST 请求的内容类型标头设置为 application/json;charset=utf-8。我会尝试将其设置回text/plain

 $httpProvider.defaults.headers.post = {'Content-Type': 'text/plain'}

如果这不起作用,我建议您检查$.ajax 发出的请求和$http 发出的请求头之间的区别

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 2013-11-02
    • 2013-06-20
    • 2020-09-29
    • 2019-08-22
    • 2016-09-07
    • 2021-06-29
    • 2019-04-25
    • 1970-01-01
    相关资源
    最近更新 更多