Междоменная связь? - PullRequest
       8

Междоменная связь?

1 голос
/ 12 ноября 2011

Я создаю небольшое приложение на javascript для использования на веб-сайте, который мне не принадлежит. Приложение включает в себя несколько опций, которые немного меняют сайт. Я хочу иметь возможность добавить систему входа в систему и чат. Из-за междоменных политик я знаю, что не могу делать обычный AJAX. Единственное, что я знаю, как это сделать, это jsonp, добавляя элементы скрипта на веб-страницу.

Если бы я использовал систему чата, которая обновлялась каждую секунду с помощью элемента script, это было бы слишком много ресурсов? Если я использую jsonp, должен ли я обновлять один элемент скрипта для новых запросов или добавлять новые каждый раз?

Является ли JSONP даже способом пойти с этим?

Ответы [ 2 ]

2 голосов
/ 12 ноября 2011

Cross-Origin Resource Sharing (CORS) - это рабочий проект W3C, который определяет, как браузер и сервер должны взаимодействовать при доступе к источникам из разных источников. Основная идея CORS состоит в том, чтобы использовать настраиваемые заголовки HTTP, чтобы браузер и сервер знали достаточно друг о друге, чтобы определить, будет ли запрос или ответ успешным или нет.

Для простого запроса, который использует либо GET, либо POST без пользовательских заголовков и чье тело text / plain, запрос отправляется с дополнительным заголовком, который называется Origin. Заголовок Origin содержит источник (протокол, имя домена и порт) запрашивающей страницы, так что сервер может легко определить, должен ли он обслуживать ответ. Пример заголовка Origin может выглядеть так:

Origin: http://www.webiste.com

Если сервер решает, что запрос должен быть разрешен, он отправляет заголовок Access-Control-Allow-Origin, возвращающий тот же источник, который был отправлен, или «*», если это общедоступный ресурс. Например:

Access-Control-Allow-Origin: http://www.webiste.com

Если этот заголовок отсутствует или происхождение не совпадает, браузер отклоняет запрос. Если все хорошо, то браузер обрабатывает запрос. Обратите внимание, что ни запросы, ни ответы не содержат информацию о файлах cookie.

Все ранее упомянутые браузеры поддерживают эти простые запросы. Firefox 3.5+, Safari 4+ и Chrome поддерживают использование через объект XMLHttpRequest. При попытке открыть ресурс из другого источника это поведение автоматически запускается без какого-либо дополнительного кода. Например:

var xhr = new XMLHttpRequest();
xhr.open("get", "http://www.webiste.com/some_resource/", true);
xhr.onload = function(){  //instead of onreadystatechange
    //do something
};
xhr.send(null);

Чтобы сделать то же самое в Internet Explorer 8, вам нужно будет использовать объект XDomainRequest таким же образом:

var xdr = new XDomainRequest();
xdr.open("get", "http://www.webiste.com/some_resource/");
xdr.onload = function(){
    //do something
};
xdr.send();

Команда Mozilla в своем посте о CORS предлагает проверить наличие свойства withCredentials, чтобы определить, поддерживает ли браузер CORS через XHR. Затем вы можете связать с существованием объекта XDomainRequest, чтобы охватить все браузеры:

function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
       return xhr;
    }

var request = createCORSRequest("get", "http:/www.webiste.com/");
if (request){
    request.onload = function(){
        //do something with request.responseText
    };
    request.send();
}

Объект XMLHttpRequest в Firefox, Safari и Chrome имеет достаточно сходные интерфейсы с объектом IE XDomainRequest, поэтому этот шаблон работает довольно хорошо. Общие свойства / методы интерфейса:

  • abort () - используется для остановки уже выполняющегося запроса.
  • onerror - использовать вместо onreadystatechange для обнаружения ошибок.
  • onload - использовать вместо onreadystatechange для обнаружения успехов.
  • responseText - использовать для получения содержимого ответа.
  • send () - использовать для отправки запроса.
0 голосов
/ 12 ноября 2011

Сервер, который будет использовать ваше приложение, должен будет добавить домен вашего приложения в файл междоменной политики.Обычно это XML-файл, который находится в корневом веб-каталоге, но точная природа зависит от того, является ли этот сервер .NET, PHP и т. Д.

После этого вы сможете выполнять вызовы ajax из своего скриптабез проблем.

IMO, динамическое добавление тегов скрипта вызывает проблемы, особенно если DOM не знает о том, что вы делаете.

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

...