我有问题发送AJAX主体请求使用jQuery CORS与自定义内容类型。
这里是我的代码:
这里是我的代码:
$.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发送它作为OPTIONS。
这里有一个标题:
响应标头:
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工作得很好,所有必需的头都是由服务器发送的,但是如果它通过OPTIONS类型发送。
是jQuery问题吗?
jQuery – 1.8.1
解决方法
此OPTIONS请求是CORS预检请求。它是在实际请求之前发送到服务器的请求,以请求提出请求的权限。自定义内容类型实际上触发预检。根据CORS规范(
http://www.w3.org/TR/cors/),除了application / x-www-form-urlencoded,multipart / form-data或text / plain之外的任何Content-Type都会触发预检。
如果您无法控制远程服务器,那么您需要请求他们支持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预检请求的更多信息: