我在使用带有自定义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”,因为它需要服务器端。但是jQuery并非以POST形式发送请求,而是以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飞行前请求。它是在实际请求之前发送到服务器的请求,以请求进行该请求的权限。定制的Content- Type实际上正在触发预检。根据CORS规范(http://www.w3.org/TR/cors/),任何内容类型 其他 比应用程序/ x-WWW窗体-urlencoded,多部分/格式数据,或文本/无格式触发器飞行前
如果您无法控制远程服务器,则需要让他们支持CORS预检,或者尝试其他一些选项,例如JSON-P。
如果您确实可以控制远程服务器,则可以对其进行更改以处理预检。为了处理预检请求,您应该在对OPTIONS请求的响应中发送以下标头:
Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST Access-Control-Allow-Headers: Content-Type
响应应该是HTTP200。Access-Control-Allow-Methods响应标头可以回显的值Access-Control-Request- Method,也可以仅GET, POST, PUT, DELETE支持所有方法。的Access-Control-Allow- Headers响应报头应在呼应值Access-Control-Request-Headers请求头。
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/zh- CN/tutorials/cors/