jQuery CORS内容types选项

我有使用jQuery CORS与自定义内容types发送AJAX正文请求的问题。 这是我的代码:

$.ajax({ url: "http://some-other-domain/my-path", type: "POST", contentType: "application/json", dataType: "json", data: JSON.stringify({ key: 1, key2: 2 }), statusCode: { 200: function(data) { } }, xhrFields: { withCredentials: true }, crossDomain: true }); 

我需要将Content-type设置为“application / json”,因为它需要服务器端。 但不是发送请求作为POST jQuery发送它作为选项。

这是一个标题:

响应标题:

 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Pragma: No-cache Cache-Control: no-cache Expires: Thu, 01 Jan 1970 03:00:00 EET Set-Cookie: JSESSIONID=BB9D6783E58FB0F2ADE1924A2F0CBA52; Path=/ Content-Type: text/html;charset=UTF-8 Content-Length: 6233 Date: Fri, 07 Sep 2012 14:41:13 GMT 

请求标题:

 OPTIONS /my-path HTTP/1.1 Host: MY-HOME-NAME User-Agent: MY_USER_AGEMT Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Origin: HERE-GOES-DOMAIN Access-Control-Request-Method: POST Access-Control-Request-Headers: content-type Pragma: no-cache Cache-Control: no-cache 

CORS工作的很好,所有必需的头文件都是由服务器发送的,但是如果通过OPTIONStypes发送,则不是。 它是jQuery的问题?

jQuery – 1.8.1

这个OPTIONS请求是CORS预检请求。 这是一个请求,在实际请求之前发送到服务器,以请求权限进行请求。 自定义Content-Type事实上触发了预检。 根据CORS规范( http://www.w3.org/TR/cors/ ),除application / x-www-form-urlencoded,multipart / form-data或text / plain以外的任何内容types都会触发预检。

如果您无法控制远程服务器,那么您需要要求他们支持CORS预检,或者尝试其他一些选项,例如JSON-P。

如果您确实能够控制远程服务器,则可以将其更改为处理预检。 为了处理预检请求,您应该在对OPTIONS请求的响应中发送以下标题:

 Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST Access-Control-Allow-Headers: Content-Type 

响应应该是HTTP 200. Access-Control-Allow-Methods响应头可以回显Access-Control-Request-Method ,也可以是GET, POST, PUT, DELETE来支持所有的方法。 Access-Control-Allow-Headers响应头应该回显Access-Control-Request-Headers请求头中的值。

一旦浏览器收到这些头文件,就会发出实际的请求。 您可以在这里了解更多关于CORS预检要求:

http://www.html5rocks.com/en/tutorials/cors/