我在使用带有自定义Content-type的jQuery CORS发送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将它作为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
答案 0 :(得分:126)
此OPTIONS请求是CORS预检请求。它是在实际请求之前发送到服务器的请求,以请求权限发出请求。自定义Content-Type实际上是触发预检。根据CORS规范(http://www.w3.org/TR/cors/),任何Content-Type 其他而不是application / x-www-form-urlencoded,multipart / form-data或text / plain会触发预检。
如果您无法控制远程服务器,那么您需要要求他们支持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预检请求的更多信息: