opcje typu zawartości jQuery CORS

Mam problem z wysłaniem AJAX body request za pomocą jQuery CORS z niestandardowym Content-type. Oto Mój kod:

$.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ż wymaga strony serwera. Ale zamiast wysyłać żądanie jako POST jQuery wysyła to jako opcje.

Oto nagłówek:

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

Nagłówki Żądania:

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łane przez serwer, ale nie, jeśli wysyła przez opcje Typ. Czy to problem z jQuery?

JQuery-1.8.1

Author: Alex Ivasyuv, 2012-09-07

1 answers

To żądanie opcji jest żądaniem inspekcji wstępnej CORS. Jest to żądanie, które jest wysyłane do serwera przed rzeczywistym żądaniem, aby poprosić o uprawnienia do złożenia żądania. Niestandardowy typ zawartości powoduje w rzeczywistości inspekcję wstępną. Zgodnie ze specyfikacją CORS ( http://www.w3.org/TR/cors/), dowolny Content-Type Inny niż application/x-www-form-urlencoded, multipart/form-data lub text / plain uruchamia inspekcję wstępną.

Jeśli nie masz kontroli nad zdalnym serwerem, następnie musisz poprosić ich o obsługę wstępnej inspekcji CORS lub wypróbować inną opcję, taką jak JSON-P.]}

Jeśli masz kontrolę nad serwerem zdalnym, możesz zmienić go na obsługę preflightów. Aby obsłużyć żądanie 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

Odpowiedzią powinien być HTTP 200. Nagłówek odpowiedzi Access-Control-Allow-Methods może albo echo wartości Access-Control-Request-Method, albo może być po prostu GET, POST, PUT, DELETE, aby obsługiwać wszystkie metody. Na Access-Control-Allow-Headers nagłówek odpowiedzi powinien odzwierciedlać wartości w nagłówku zapytania Access-Control-Request-Headers.

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

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

 135
Author: monsur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-07 15:33:25