2012-09-07 11 views
40

Mam problem z wysyłaniem żądania treści AJAX przy użyciu jQuery CORS z niestandardowym typem treści. Oto mój kod:jQuery CORS Typy treści OPCJE

$.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 
}); 

muszę ustawić Content-type jako "application/json", ponieważ wymagają po stronie serwera. Ale zamiast wysyłać żądanie jako POST jQuery wysyła je jako OPCJE.

Oto nagłówki:

nagłówki odpowiedzi:

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 

Żądanie Nagłówki:

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 działa świetnie, wszystkie wymagane nagłówki są wysyła przez serwer, ale nie jeśli wysyła przez Typ opcji. Czy to problem z jQuery?

jQuery - 1.8.1

Odpowiedz

110

Żądanie OPTIONS jest żądanie inspekcji wstępnej CORS. Jest to żądanie, które jest wysyłane do serwera przed rzeczywistym żądaniem, aby poprosić o uprawnienia do wykonania żądania. Niestandardowy typ zawartości faktycznie uruchamia preflight. Zgodnie ze specyfikacją CORS (http://www.w3.org/TR/cors/), każdy plik typu Content-Type , inny niż niż formularz/x-www-zakodowany, wieloczęściowy/formularzowy lub tekst/zwykły, uruchamia preflight.

Jeśli nie masz kontroli nad serwerem zdalnym, musisz albo poprosić ich o wsparcie preflightu CORS, albo spróbować innej opcji, takiej jak JSON-P.

Jeśli masz kontrolę nad serwerem zdalnym, możesz go zmienić, aby obsługiwał preflighty. Aby obsłużyć żądania inspekcji wstępnej, należy wysłać następujące nagłówki w odpowiedzi na żądanie opcji:

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

odpowiedź powinna być HTTP 200. Nagłówek Access-Control-Allow-Methods reakcja może albo echo wartości Access-Control-Request-Method, lub może po prostu być GET, POST, PUT, DELETE, aby obsługiwać wszystkie metody. Nagłówek odpowiedzi Access-Control-Allow-Headers powinien wywoływać echo wartości w nagłówku żądania Access-Control-Request-Headers.

Gdy przeglądarka otrzyma te nagłówki, wyświetli rzeczywiste żądanie. Możesz dowiedzieć się więcej o Cors inspekcji wstępnej wniosków tutaj:

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

+3

You. Są. A. Godsend. Sprawa Zezwalaj na nagłówki jest tym, co dostałem. Ale więcej niż kod, który napisałeś, twoje wyjaśnienie pomogło zapalić żarówkę, aby pomóc mi wymyślić, jak wszystko działa. Dzięki! – appsecguy

+0

haaaaaa, dziękuję! –

+2

To nie działa dla mnie:/Po prostu robię to dokładnie w ten sposób w filtrze serwletowym –

Powiązane problemy