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

Мне нужно установить Content-type как "application/json", так как он требует серверной части. Но вместо отправки запроса как POST jQuery отправляет его как ОПЦИИ.

Здесь заголовки:

Заголовки ответов:

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

Ответ 1

Этот запрос 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/