2012-09-07 55 views
40

我使用jQuery CORS與自定義內容類型發送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 
}); 

我需要設置內容類型爲「應用/ 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的偉大工程,所有必需的標頭是服務器發送,但如果它通過發送不選項類型。 它是jQuery的問題?

jQuery - 1.8.1

回答

110

此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預檢請求的更多信息:

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

+3

您。是。 A.天賜。 Allow-Headers問題是讓我感到滿意的。但不只是你發佈的代碼,你的解釋有助於激發燈泡,幫助我弄清楚如何讓所有的東西都能正常工作。謝謝! – appsecguy

+0

haaaaaaa,謝謝! –

+2

它不適用於我:/我只是這樣做在servlet過濾器 –