如何在跨域(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预检示例 ,该示例显示了这些标头的实际应用。