Как сделать запрос перекрестного домена
Как вы знаете, безопасность веб-браузера запрещает создание междоменных запросов. Я прочитал книгу, в которой говорится, что вы должны использовать XMLHTTPRequest, только если вы можете поместить файлы на сервер (это означает, что вы загружаете страницу в тот же запрошенный домен). Если вы не можете - вы должны искать альтернативу.
Мои вопросы:
- Что такое альтернативный вариант перекрестного домена для XMLHTTPRequest?
- Как насчет WebSockets? Предоставляет ли эта технология запрос на перекрестный домен?
EDIT:
Мне все еще не ясно...
Например, я вытаскиваю свою страницу с сайта www.domain1.com, и мне нужно запросить javascript с сайта www.domain2.com. Поэтому вытащенная страница должна включать что-то вроде:
<script src="www.domain2.com/script.js"></script>
чтобы избежать ограничений перекрестных доменов.
И я могу использовать JSONP, и запрос будет выглядеть так:
http://ww.domain1.com/?callback=someFunction.js
Но: разве это не то же самое? Я просто вытаскиваю js из другого домена! Предотвращает ли это перекрестные ограничения?
Ответы
Ответ 1
Вы можете сделать запросы кросс-домена, используя объект XMLHttpRequest
. Это делается с использованием "Cross Origin Resource Sharing". Видеть:
http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
Очень просто поставить, когда запрос сделан на сервер, сервер может ответить заголовком Access-Control-Allow-Origin
, который либо разрешит, либо отклонит запрос. Браузеру необходимо проверить этот заголовок, и если он разрешен, он будет продолжен с процессом запроса. Если браузер не отменит запрос.
Здесь вы можете найти дополнительную информацию и рабочий пример:
http://www.leggetter.co.uk/2010/03/12/making-cross-domain-javascript-requests-using-xmlhttprequest-or-xdomainrequest.html
JSONP - альтернативное решение, но вы можете поспорить с ним немного взломом.
Ответ 2
Сделайте междоменный вызов AJAX
Ваш веб-сервис должен поддерживать метод инъекции, чтобы сделать JSONP.
Ваш код кажется прекрасным, и он должен работать, если ваши веб-службы и веб-приложение размещены в одном домене.
Когда вы делаете $.ajax с dataType: 'jsonp', означающий, что jQuery фактически добавляет новый параметр к URL-адресу запроса.
Например, если ваш URL http://10.211.2.219:8080/SampleWebService/sample.do
, то jQuery добавит? callback = {some_random_dynamically_generated_method}.
Этот метод более похож на прокси-сервер, фактически прикрепленный в объекте окна. Это ничего конкретного, но выглядит примерно так:
window.some_random_dynamically_generated_method = function(actualJsonpData) {
//here actually has reference to the success function mentioned with $.ajax
//so it just calls the success method like this:
successCallback(actualJsonData);
}
Для получения дополнительной информации проверьте следующее
http://json-p.org/
Сделать запрос JSONP с двумя доменами ajax с помощью jQuery
Ответ 3
Если вы готовы передать некоторые данные и что вам не нужно защищаться (любая общедоступная информация), вы можете использовать прокси-сервер CORS, это очень просто, вам не придется ничего менять в коде или на стороне сервера (особенно это не ваш сервер, как API Yahoo или OpenWeather).
Я использовал его для получения JSON файлов с помощью XMLHttpRequest, и он отлично работал.