【问题标题】:CORS preflight OPTIONS request returning error, but POST still being sentCORS preflight OPTIONS 请求返回错误,但仍在发送 POST
【发布时间】:2012-12-31 23:25:54
【问题描述】:

我正在使用 jQuery ajax 从我的站点向 asmx 服务发出跨域请求,如下所示:

$j.ajax({
  url: svcURL,
  type: "POST",
  data: xml,
  contentType: "text/xml",
  dataType: "text",
  success: function(d) {
    alert(d);
  },
  error: function(a, b, c) {
    alert("error");
  }
});

POST 请求之前有一个预检OPTIONS 请求,该服务当前未配置为处理该请求,因此它返回500 (Internal Server Error)405 (Method Not Allowed)

收到此错误后,我希望浏览器随后会忽略POST 请求并返回错误,但是:

在 Chrome 和 IE 中仍会发送 POST 请求(服务已正确配置为处理该请求)并收到响应。

在 Firefox 中POST 只会返回错误。

有人能解释一下为什么这在 Chrome 中有效吗?我本来希望它的行为与 Firefox 一样。

提前感谢您的帮助。

【问题讨论】:

  • 您确定 OPTIONS 请求确实被触发了吗?您是否看到它在网络选项卡或萤火虫中返回响应?
  • 是的,我可以看到 OPTIONS 请求正在控制台/Fiddler 中发送。使用我正在使用的当前服务,我得到 405 错误响应。随后的 POST 在 Chrome 中运行,但在 Firefox 中返回错误。
  • 我有一个测试 CORS 请求的页面。当我尝试使用 Content-Type: text/xml 发出 POST 请求时,我收到一个错误:client.cors-api.appspot.com/… 你看到同样的行为吗?请注意 OPTIONS 请求是如何在 Chrome 的网络浏览器中被拒绝的。
  • 我已将我的服务配置为允许 Content-Type 标头,因此我看不到与您相同的行为。对于我的请求,Chrome 的控制台显示:OPTIONS http://website.com/svc.asmx 405 (Method Not Allowed)
  • 在Chrome中请求成功后,Content-Type的header还是text/xml吗?也许它将请求降级为不需要预检的简单请求。 (对于浏览器来说,这似乎是一件非常愚蠢的事情,但也许 jQuery 可以做到?)

标签: javascript ajax post cross-domain cors


【解决方案1】:

有一个bug in ChromeWebKit即使OPTIONS请求失败也会发送后续请求。

Firefox 正确遵循 CORS 规范,并在预检失败后取消请求。

【讨论】:

    猜你喜欢
    • 2012-12-22
    • 2014-04-25
    • 2019-01-05
    • 2018-07-03
    • 2022-01-21
    • 2011-10-11
    • 2021-04-24
    • 2014-09-07
    • 2022-01-06
    相关资源
    最近更新 更多