我正在尝试发送一个JSON有效负载的CORS请求。我控制服务器和客户端。
服务器有一个自定义标头,必须与每个请求一起发送。因此,此自定义标头使请求“不简单”,因此请求必须使用OPTIONS请求进行预检。
我可以看到jquery发出OPTIONS请求,但它不会发送自定义标头。
方法我尝试过:
>使用beforeSend选项:http://api.jquery.com/jQuery.ajax/
>使用ajax预滤器:http://api.jquery.com/jQuery.ajaxPrefilter/
在这两种情况下,浏览器都不会发送自定义标头。
我正在使用FF 17.0.1,jquery 1.8.3。
解决方法
你的问题不在于jquery,它在
how CORS works.你的beforeSend回调可能正常工作……但浏览器不会在预检请求中发送自定义标题,无论如何。这是设计的;预检请求的目的是确定允许使用者(浏览器)发送的信息超出CORS规范中定义的“简单”内容。因此,对于useragent发送任何非简单数据(例如您的自定义标头)作为预检请求的一部分是弄巧成拙的。
要指示useragent在实际CORS请求中包含您的自定义标头,请在您的预检响应中包含Access-Control-Allow-Headers
header。值得注意的是,如果您并不过分担心useragent传输的标头,我相信您可以回复Access-Control-Request-Headers请求标头字段的值作为Access-Control-Allow-的值您在回复中发送的标头。
您可能还希望包含syntax section of the spec中定义的其他一些Access-Control-Allow- *标头。
另见CORS – How do ‘preflight’ an httprequest?
另请参见Mozilla’s CORS preflight example,其中显示了这些标题的实际效果。