Использование свойства 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
Надеюсь, что мой пример использования понятен!