30

我正在尝试为 JSON 有效负载发送 CORS 请求。我控制服务器和客户端。

我在这里关注: https ://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control

服务器有一个自定义标头,必须与每个请求一起发送。因此,此自定义标头使请求“不简单”,因此必须使用 OPTIONS 请求对请求进行预检。

我可以看到 jquery 发出 OPTIONS 请求,但它没有发送自定义标头。

我试过的方法:

在这两种情况下,浏览器都不会发送自定义标头。

我正在使用 FF 17.0.1,jquery 1.8.3。

4

1 回答 1

42

您的问题不在于 jquery,而在于 CORS 的工作方式。您的 beforeSend 回调可能按预期工作......但无论如何浏览器都不会在预检请求中发送自定义标头。这是设计使然;预检请求的目的是确定允许用户代理(浏览器)发送超出 CORS 规范中定义的“简单”内容的信息。因此,对于用户代理发送任何非简单数据(例如您的自定义标头)作为预检请求的一部分是弄巧成拙的。

要指示用户代理在实际的 CORS 请求中包含您的自定义标头,请Access-Control-Allow-Headers您的预检响应中包含标头。值得注意的是,如果您不太关心用户代理传输的标头,我相信您可以将Access-Control-Request-Headers请求标头字段的值作为Access-Control-Allow-Headers您在响应中发送的值回显。

您可能还希望包含在规范的语法部分中Access-Control-Allow-*定义的其他一些标头。

另请参阅CORS - 如何“预检”httprequest?

另请参阅Mozilla 的 CORS 预检示例,其中显示了这些标头的实际操作。

于 2012-12-21T21:12:31.697 回答