使用 jQuery 发送 'simple' POST 请求,但仍然获得 CORS



CORS规范指出,如果HTTP请求被认为是"简单的",则不需要CORS和/或预检。

我正在尝试执行似乎具有以下条件的HTTP请求:

  • 我没有设置自定义 HTTP 标头。
  • 我使用的是POST方法。
  • 我正在使用application/x-www-form-urlencoded.

代码示例:

$.ajax({
type: 'POST',
url: 'http://example.org/',
data: {foo: 'bar'}
});

但是,在运行此请求时,请求仍使用OPTIONS进行预检(失败)。我缺少什么明显的东西吗?

对简单请求的一些引用:

  • https://w3c.github.io/webappsec-cors-for-developers/#cross-origin-send-permissions-simple-safelisted-request
  • https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Simple_requests

CORS 限制会影响从一个域到另一个域的所有请求。 示例:本地主机 -> example.com。我最终只是转到我的 example.com 服务器端代码,并确保我启用来自我从中拨打电话 myotherexample.com 的请求。在本地开发时使用 CORS 标头执行此操作

Access-Control-Allow-Origin: *

准备生产时的另一个示例

Access-Control-Allow-Origin: https://myotherexample.com

我在重新阅读文档时意识到了我的错误。

我所做的确实是一个简单的要求。该请求实际上是在没有OPTIONS请求的情况下发送到服务器的,并且成功了!

但是,当它回来时,我不允许阅读回复。因此,简单和非简单 CORS 请求之间的真正区别在于:

对于简单请求,不需要预检,但服务器仍需要使用 CORS 标头进行响应。

所以我的选择如下:

  1. 我忽略了这个错误。毕竟请求成功了,我只是看不懂响应。
  2. 无论如何,我都实现了 CORS 服务器端。就我而言,我不能,因为我无法控制目标服务器。
  3. 我使用 html 表单提交数据,调用.submit()并定位隐藏的 iFrame。
  4. 通过我控制的服务器代理请求。

前途:

我认为,但我不确定,新的 Fetch API 还允许一种模式,您可以在其中跨域发出 HTTP 请求,选择退出 CORS 并简单地被拒绝访问 HTTP 响应。如果这是正确的,那么这将是这样做的理想方式(对我来说)。但我不知道 100% 确定这是否确实是这样工作的。

相关内容

  • 没有找到相关文章