如何在跨域(CORS)XMLHttpRequest中发送自定义标头?

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

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

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

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

方法我尝试过:

  • 使用beforeSend选项: http : //api.jquery.com/jQuery.ajax/
  • 使用ajax预filter: http : //api.jquery.com/jQuery.ajaxPrefilter/

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

我正在使用FF 17.0.1,jquery 1.8.3。

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

要指示useragent在实际CORS请求中包含您的自定义标头 ,请在预检响应中包含Access-Control-Allow-Headers标头 。 值得注意的是,如果您并不过分担心useragent传输的标头,我相信您可以回复Access-Control-Request-Headers请求标头字段的值作为Access-Control-Allow-Headers您在回复中发送的标Access-Control-Allow-Headers

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

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

另请参阅Mozilla的CORS预检示例 ,该示例显示了这些标头的实际应用。