Следующая таблица дает результаты гомологичного обнаружения по сравнению с http://store.company.com/dir/page.html:
Чтобы решить перекрестные задачи, мы можем использовать следующие методы:
1. Cross-Domain через JSONP
В JS невозможно напрямую запросить данные в разных доменах, используя xmlhttprequest. Тем не менее, можно ввести файлы сценариев JS в разных доменах на странице, и JSONP использует эту функцию для ее достижения.
Например, есть страница A.HTML, и код в ИТ должен использовать AJAX для получения данных JSON в другом домене. В A.HTML вот и все:
Мы видим, что есть параметр обратного вызовов после адреса получения данных. Конечно, если адресная страница JSONP для получения данных не контролируется вами, вы должны работать в соответствии с указанным форматом стороны, которая предоставляет данные.
Поскольку он введен в качестве файла JS, возврат http://example.com/data.php должен быть исполняемым файлом JS, поэтому код PHP этой страницы может выглядеть так:
Окончательным результатом вывода этой страницы является:
Таким образом, файл JS, полученный через http://example.com/data.php?callback=dosomething,-это функция dosomething, которую мы определяли ранее, и его параметры-это данные JSON, которые нам нужны, поэтому мы получаем необходимые данные, которые нам нужны данные.
Таким образом, принцип JSONP очень ясен. проходит как параметры. Следовательно, JSONP требует, чтобы страница на стороне сервера соответственно сотрудничала.
Узнав принцип перекрестного домена JSONP, мы можем использовать JS для динамического генерации тегов сценариев для операций по перекрестной области, без преднамеренного написания тегов сценариев вручную. Если ваша страница использует jQuery, то метод инкапсуляции может использоваться для очень удобного выполнения операций JSONP.
Принцип такой же, за исключением того, что нам не нужно вручную вставлять теги сценариев и определять функцию обратно. JQUERY автоматически генерирует глобальную функцию, чтобы заменить знак вопроса в Callback =?, а затем он автоматически уничтожит данные после получения его. Метод. Загрузка файлов JS.
2. Cross SubdomaN путем изменения Document.domain
Браузеры имеют гомологичную политику, и одним из его ограничений является то, что в первом методе мы сказали, что документы из разных источников не могут быть запрошены с помощью метода Ajax. Его второе ограничение состоит в том, что взаимодействие JS не может быть выполнено между рамками разных доменов в браузере. Отнесее отметить, что разные рамки (отец и сын или генерация сверстников) могут получить объекты окна друг друга, но боль состоит в том, что вы не можете использовать свойства и методы полученных объектов окон (метод Postmessage в HTML5 это исключение. Некоторые браузеры, такие как IE6, также могут использовать несколько атрибутов, таких как Top и Parent). Например, есть страница, адрес которого - http://www.example.com/a.html. На этой странице есть разные домены из фреймворка IFRAME внутри нее, поэтому мы не можем получить вещи в iframe, написав код JS на странице:
В настоящее время Document.domain может пригодиться. Установите его на одно и то же доменное имя. Но следует отметить, что настройка документа. Доменен ограничен. Например: Document.domain документа на abexample.com может быть установлен на любой из Abexample.com, B.Example.com и example.com, но его нельзя установить на Cabexample.com, потому что это ребенок Из текущего домена домена вы не можете установить его на baidu.com, потому что основной домен уже не совсем.
Установите Document.domain на странице http://www.example.com/a.html:
Document.domain также установлен на странице http://example.com/b.html, и это также необходимо.
Таким образом, мы можем получить доступ к различным свойствам и объектам в iframe через JS.
Однако, если вы хотите напрямую запросить страницу http://example.com/b.html через страницу Ajax на странице http://www.example.com/a.html, даже если вы устанавливаете один и тот же документ. Это все еще не будет работать. Если вы хотите взаимодействовать с страницами разных поддоменов с помощью метода AJAX, в дополнение к использованию метода JSONP, вы также можете использовать скрытый iFrame, чтобы действовать в качестве прокси. Принцип состоит в том, чтобы позволить этому iframe загрузить страницу с тем же доменом, что и целевая страница, которую вы хотите получить через Ajax, поэтому страница в этом iframe может использовать Ajax для получения данных, которые вы хотите, а затем через нас я только что упомянул что метод изменения Document.domain позволяет нам полностью управлять этим iframe через JS, чтобы мы могли позволить iframe отправить запрос Ajax, а также мы можем получить полученные данные.
3. Используйте Window.name to Cross Domain
У окна объект имеет атрибут имени, который имеет функцию: то есть в течение жизненного цикла окна все страницы, загруженные окном, обмениваются окном и написать разрешения, Window.Name сохраняется на всех страницах, загруженных окном, и не будет сброшено из -за загрузки новых страниц.
Например: есть страница a.html, которая содержит следующий код:
Давайте посмотрим на код страницы B.HTML:
Через 3 секунды после загрузки страницы A.HTML она прыгает на страницу B.HTML, и результат:
Мы видим, что значение, установленное его предыдущей страницей A.HTML для Window.Name, было успешно получено на странице B.HTML. Если все загруженные страницы не изменяли Window.Name впоследствии, значение Window.Name, полученное всеми этими страницами, является значением, установленным страницей A.HTML. Конечно, при необходимости любая из страниц может изменить значение window.name. Обратите внимание, что значение Window.name может быть только в форме строки.
В приведенном выше примере страницы A.HTML и B.HTML, которые мы использовали, находятся в одном и том же домене, но даже если A.HTML и B.HTML находятся в разных доменах, также применим приведенный выше вывод, что точно так же. Принцип кросс-домены с использованием window.name.
Давайте посмотрим, как получить данные по доменам через Window.name. Давайте приведем пример.
Например, существует страница www.example.com/a.html, и вам необходимо использовать JS на странице A.HTML, чтобы получить данные на другой странице, расположенной на другой домене www.cnblogs.com/data.html Полем
Код на странице Data.html очень прост, который состоит в том, чтобы установить значение данных, которое хочет получить страницу A.HTML для текущего Window.Name. Код в data.html:
Итак, на странице A.HTML, как мы загружаем страницу data.html? Очевидно, что мы не можем напрямую загрузить страницу data.html, изменяя window.location на странице A.HTML, потому что мы хотим получить данные в data.html, даже если страница A.HTML не прыгает. Ответ состоит в том, чтобы использовать скрытую IFRAME на странице A.HTML, чтобы действовать в качестве посредника, а IFRAME получает данные DATA.HTML, а затем A.HTML получает данные, полученные IFRAME.
Если iframe, действующий в качестве посредника, хочет получить набор данных через Window.name of Data.html, вам нужно только установить SRC этого IFRAME на www.cnblogs.com/data.html. Затем A.HTML хочет получить данные, полученные IFRAME, то есть, чтобы получить значение окна iframe. Предыдущее в той же стратегии происхождения, A.HTML не может получить доступ к свойству Window.Name в iFrame. Это весь перекрестный процесс.
Посмотрите на код страницы A.HTML:
Приведенный выше код - это просто простейший принцип демонстрационного кода. прокси. Есть также много похожих готовых кодов в Интернете.
Крестный домен через окно.
4. Используйте вновь введенный Window. Метод Postmessage в HTML5 для передачи данных по доменам
Window.postmessage (Message, Targettorigin) - это недавно введенная функция HTML5. , Opera и т. Д. Все машины уже поддерживают метод Window.postmessage.
Объект окна, который вызывает метод Postmessage, относится к объекту Window, который должен получить сообщение. Сообщение, которое получено.
Объект Window, который необходимо получить сообщения, может быть получен, прослушивая собственное событие сообщения, а содержимое сообщения сохраняется в атрибуте данных объекта события.
Вышеупомянутые отправки сообщений в другие окно-объекты фактически относятся к ситуации, когда на странице есть несколько кадров, потому что в каждом кадре есть окно-объект. При обсуждении второго метода мы сказали, что объект окна другой стороны может быть получен между рамками разных доменов и методом Window.postmessage также может использоваться. Вот простой пример с двумя страницами
Результат, который мы получаем после запуска страницы:
Мы видели эту страницу B успешно получила сообщение.
Это довольно интуитивно и удобно использовать Postmessage для передачи данных по доменам, но недостаток заключается в том, что IE6 и IE7 не поддерживают их, так что использовать их или нет, зависит от фактических потребностей.