Использование свойства jQuery ajax crossDomain?

В соответствии с jQuery:

crossDomain (default: false for same-domain requests, true for cross-domain requests) Тип: Boolean Если вы хотите принудительно запрос crossDomain (например, JSONP) в том же домене, установите значение от crossDomain до true. Это позволяет, например, на стороне сервера перенаправление в другой домен. (версия добавлена: 1.5)

Я не понимаю выше.

Если код

$(document).ready(function ()
{
    $.ajax(
    {
        url: 'http://es3.com/Handlers/MyHandler.ashx',
        cache: false,
        dataType: "jsonp",
        ...
        ...
    });
});

function aaa(json)
{
    alert(json.result);
}

И im speciying datatype:jsonp, тогда ответ будет применяться к типу application/javascript mime, потому что он будет script, который будет запущен в моем браузере.

Я не вижу никакой причины , почему она не будет действовать как, когда я запускаю этот код в домене того же. (следовательно, я не вижу использования этого свойства).

Я сделал образец

У меня есть 2 (хост-tweaked) домены. es2.com и es3.com.

(обратите внимание, что URL-адрес в коде всегда равен es3.com)

Тест № 1:

Запустите код из es3.com: (левая панель)
Запустите код из es2.com: (правая панель)
crossDomain:false (по умолчанию, если отсутствует).

посмотрите на различия: (http://i.stack.imgur.com/RKyZp.jpg)

введите описание изображения здесь

Тест № 2:

Запустите код из es3.com: (левая панель)
Запустите код из es2.com: (правая панель)
crossDomain:true < --- notice

(http://i.stack.imgur.com/xEcyd.jpg) введите описание изображения здесь

Я не вижу никакой разницы.

Вопрос:

Почему/когда мне нужно установить свойство crossDomain?

Ответ 1

по умолчанию для crossDomain выглядит следующим образом:

false для запросов одного домена, true для запросов crossDomain

data-type интерпретируется по-разному в зависимости от значения для параметра crossDomain:

"json": оценивает ответ как JSON и возвращает JavaScript объект. Междоменные запросы "json" преобразуются в "jsonp", если только запрос включает jsonp: false в своих параметрах запроса

Поскольку вы используете jsonp вместо json, вы не увидите никакой разницы в ваших тестах.

Когда мне нужно установить свойство crossDomain?

Если вы делаете один и тот же запрос домена json, и ваш сайт может перенаправить запрос в другой домен для ответа (через HTTP 3XX), тогда вы должны установить для свойства crossDomain значение true, чтобы ответ мог читайте по вашему вызову script.

Это дает вам преимущество в том, что вы получаете JSON при выполнении одинаковых запросов о происхождении и о функциях JSONP при выполнении запросов с кросс-началом. Если CORS активен в домене, к которому вы перенаправляетесь, вы можете установить jsonp: false в параметрах запроса.

Примеры

Выполнение запроса с example.com на example.org.

  • crossDomain автоматически устанавливается в true.
  • Тип данных установлен на jsonp.

Результат: JSONP, возвращенный example.org.

Выполнение запроса с example.com на example.com.

  • crossDomain автоматически устанавливается в значение false.
  • Тип данных установлен на jsonp.

Результат: JSONP, возвращенный example.com.

Выполнение запроса с example.com на example.org.

  • crossDomain автоматически устанавливается в true.
  • Тип данных установлен на json.

Результат: JSONP, возвращенный example.org.

Выполнение запроса с example.com на example.com.

  • crossDomain автоматически устанавливается в значение false.
  • Тип данных установлен на json.

Результат: JSON возвращен example.com.

Выполнение запроса с example.com на example.org.

  • crossDomain автоматически устанавливается в true.
  • Тип данных установлен на json.
  • jsonp установлено значение false.
  • example.org не поддерживает CORS для example.com

Результат: Ошибка CORS, возвращенная браузером.

Выполняя запрос с example.com на example.com, example.com перенаправляет AJAX на example.edu.

  • crossDomain вручную установлено значение true.
  • Тип данных установлен на json.

Результат: JSONP возвращен example.edu.

Выполнение запроса с example.com на example.org.

  • crossDomain автоматически устанавливается в true.
  • Тип данных установлен на json.
  • jsonp установлено значение false.
  • example.org действительно поддерживает CORS для example.com

Результат: JSON возвращен example.org.

Выполняя запрос с example.com на example.com, example.com перенаправляет AJAX на example.edu.

  • crossDomain автоматически устанавливается в значение false.
  • Тип данных установлен на json.
  • example.edu не поддерживает CORS для example.com

Результат: Ошибка CORS, возвращенная браузером.

Ответ 2

Предположим, у вас есть еще один домен spanish.es2.com, который обслуживает испанских пользователей вашего сайта.

У вас есть следующее требование:

  • Наличие веб-страницы es2.com

  • Вызвать api на es2.com и передать ему некоторую информацию о пользователе (или файл cookie) и получить некоторые пользовательские данные. Но если пользователь является испанским, api на spanish.es2.com нужно вызывать для тех же данных.

  • Когда вы делаете запрос ajax с jQuery с сайта es2.com на es2.com, для испанского пользователя:

    (a) С crossdomain отключено: ваш es2.com api найдет, что пользователь испанский, и, следовательно, перенаправляет http на spanish.es2.com, который не будет работать из-за ajax той же политики домена, и ajax будет потерпеть неудачу. Перенаправления в ajax url → Запрещено.

    (b) Включен crossdomain: ваш ответ api jsonp на es2.com, фактически загружен как тег script, завернутый в функцию, поэтому перенаправление http в другой домен не имеет значения, а контент все еще загружается, следовательно, работает ajax. Перенаправления в src тега script → Разрешено.

Надеюсь, это даст понять.

Ответ 3

Насколько я понимаю, op корректен. Установка dataType в jsonp создаст запрос типа JSONP; с результатом, записанным в блок script и запуском. Поэтому принудительное включение JSONP путем установки кросс-домена в true представляется избыточным.

Однако. В документации говорится, что "если вы хотите принудительно выполнить междоменный запрос, такой как JSONP", что подразумевает, что могут быть и другие случаи, когда вы, возможно, захотите заставить междоменное поведение. Я не уверен, что эти случаи могут быть.

Ответ 4

Неисправность по умолчанию отсутствует. При отсутствии значения по умолчанию значение true, если домены не совпадают (как в первом примере выше). Я думаю, вы можете оставить это значение по умолчанию почти в том случае, если не во всех случаях.

Кроме того, при настройке междоменного параметра JQuery пытается использовать CORS по умолчанию, а не JSONP.

Вот некоторые соответствующие фрагменты из источника JQuery: https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js

переменная "xhrSupported"...

xhrSupported = jQuery.ajaxSettings.xhr();

.. используется для проверки поддержки CORS....

support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );

.., который проверяется при выполнении вызовов AJAX....

jQuery.ajaxTransport(function( options ) {
        var callback;

        // Cross domain only allowed if supported through XMLHttpRequest
        if ( support.cors || xhrSupported && !options.crossDomain ) 

Надеюсь, это поможет!

Ответ 5

Если вы уже указываете JSONP, параметр crossDomain не делает многого. Он просто сообщает jQuery просить JSONP, даже если это локальный домен.

Скажем, вы работаете на своей машине с локальной службой, которая возвращает JSON или JSONP. Вы можете использовать обычный вызов $.ajax(), который работает нормально. Однако при производстве сервер перенаправляет ваш запрос в другой домен, если вы встречаете некоторые особые условия. Prod должен запросить JSONP, потому что иногда ответ приходит из вне домена.

Выполнение вызова $.ajax() без crossDomain: true или datatype: 'jsonp' предполагает, что ответ может быть простым JSON, поэтому код не будет работать.

Вы также можете получить междоменный XML через prestidigitation, например загрузку междоменного XML через JSONP с помощью YQL, который действительно просто обертывает его JSONP.

Ответ 6

Вы, наверное, очень помогли мне понять проблему, с которой я сталкиваюсь при использовании jsonp с jQuery.
В моем случае мне нужно было позвонить JSONP во внешний домен.
Но url нужно было построить из нашего домена.

Например, здесь я предполагаю, что мой сайт находится под es2.com

JSONP вызывается es2.com
es2.com перенаправление на es3.com?newConstructedUrl=someRandomValue
es3.com?newConstructedUrl=NewCoolValue перенаправление на es2.com
es2.com ответьте на установку нового файла cookie в ответе

Код работал нормально в localhost, но у нас не было cookie в среде es2.
И, увидев Отладчик, запрос выполнялся в XHR в среде es2 Тогда нам нужно было установить для параметра crossDomain значение true. Затем запрос JSONP был выполнен даже в es2.com

Надеюсь, что мой пример использования понятен!