Сообщений 7 Оценка 0 Оценить |
Введение Описание XDomainRequest Использование Требования к серверу Ограничения |
Новый Internet Explorer 8 (IE8) принес с собой одно приятное нововведение, призванное, как когда-то это сделал XMLHttpRequest, облегчить жизнь программистам и дать большие возможности для взаимодействия с пользователем.
Напомню, что XMLHttpRequest может работать при условии, что запрашиваемый документ и страница, с которой направлен запрос, находятся в одном домене. Например, если страница с кодом XMLHttpRequest-запроса лежит по адресу http://www.landgraph.ru/test/test_xml.html, то запрашиваемый XML-файл должен иметь URL http://www.landgraph.ru/test/test_xml.xml.
Новой «фишкой» восьмой версии IE8 является интерфейс XDomainRequest (IHTMLXDomainRequest), с помощью которого, в отличие от XMLHttpRequest, можно делать запросы к различным доменам. Другими словами, страница с кодом XDomainRequest может находиться по адресу http://www.landgraph.ru/test/test.html, а запрашиваемая страница – http://www.google.com/.
Рассмотрим структуру интерфейса. Основные элементы интерфейса, необходимые для работы, отмечены жирным шрифтом.
Каждый объект XDomainRequest имеет следующие свойства:
Свойство | Описание |
contentType | Свойство доступно для чтения и записи, определяет тип как полученных, так и передаваемых данных |
responseText | Свойство доступно для чтения и содержит данные, полученные от сервера в текстовом виде |
timeout | Свойство доступно для чтения и записи, содержит значение времени ожидания ответа сервера |
Объект XDomainRequest может порождать следующие события:
Событие | Описание |
---|---|
onerror | Событие происходит, когда во время запроса произошла какая-то ошибка, кроме превышения времени ожидания ответа (см. ниже). Точнее узнать род ошибки пока не возможно. |
onload | Событие происходит, когда полностью получен ответ от сервера. |
onprogress | Событие происходит, когда браузер начинает получение данных от сервера. |
ontimeot | Событие происходит, когда превышено время ожидания ответа от сервера. |
Все объекты XDomainRequest обладают следующим набором методов:
object.open(Method, URL) |
Method – строка “GET” или “POST”, в зависимости от метода передачи данных серверу, обязательный параметр.
URL – адрес документа на сервере, обязательный параметр.
object.send([Data]) |
Data – данные, которые необходимо передать на сервер, необязательный параметр.
object.abort() |
Теперь перейдем к программированию. Все примеры написаны на языке JavaScript. Проверить наличие XDomainRequest просто:
if(window.XDomainRequest) { //Действия при наличии интерфейса } else { //Действия в отсутствие интерфейса } |
В принципе, все точно так же, как и при работе с XMLHttpRequest.
Создать объект интерфейса можно с помощью следующего кода:
var xdr = new window.XDomainRequest; |
Теперь необходимо открыть соединение с сервером. Сделать это можно с помощью метода open:
xdr.open("get", "http://www.landgraph.ru/test/test_xdr.php"); |
В данном случае указан метод GET передачи запроса. Далее следует отослать запрос с помощью метода send:
xdr.send("какие-то данные");
|
При этом мы можем и не передавать данные, а вызвать метод без параметров:
xdr.send(); |
Всё. На этом передача данных завершается. Итого у нас получился следующий код:
if(window.XDomainRequest) { var xdr = new window.XDomainRequest; xdr.open("get", "http://www.landgraph.ru/test/test_xdr.php"); xdr.send(); } else { alert("XDomainRequest отсутствует!");} |
Получить данные от сервера можно, если установить обработчик события onload объекта. Напомню, что событие onload происходит, когда данные от сервера получены в полном объеме.
xdr.onload = xdrLoad; ... function xdrLoad() { var data=xdr.responseText; //Выполнение действий с полученными данными } |
Например, следующий код выводит полученные данные в виде сообщения:
if(window.XDomainRequest) { var xdr = new window.XDomainRequest; xdr.onload=xdrLoad; xdr.open("get", "http://www.landgraph.ru/test/test_xdr.php"); xdr.send(); } else { alert("XDomainRequest отсутствует!");} function xdrLoad() { var data=xdr.responseText; alert("Приняты данные следующего содержания:\r\n"+data); } |
Не секрет, что во время работы случаются те или иные ошибки. Об этих ошибках нужно либо сообщить пользователю, либо обработать их самостоятельно. Пока что можно обработать только два вида ошибок: превышение времени ожидания ответа сервера и все остальные ошибки. Первые обрабатываются через событие ontimeout, вторые – через событие onerror. Пример:
if(window.XDomainRequest) { var xdr = new window.XDomainRequest; xdr.onerror=xdrError; xdr.onerror=xdrTimeOut; xdr.open("get", "http://www.landgraph.ru/test/test_xdr.php"); xdr.send(); } else { alert("XDomainRequest отсутствует!");} function xdrError() { alert("Во время выполнения запроса произошла ошибка!"); } function xdrTimeOut() { alert("Истекло время ожидания ответа сервера, попробуйте еще раз!"); } |
При использовании интерфейса XDomainRequest веб-серверу направляется запрос, в заголовке которого присутствует поле
XDomainRequest: 1
При получении подобного запроса сервер обязательно должен установить поле заголовка ответа:
XDomainRequestAllowed: 1
Иначе пользователь получит сообщение об ошибке. Ниже приведен пример рабочего скрипта PHP, с помощью которого вы всегда можете проверить работоспособность своего детища. Для тестирования вы также можете воспользоваться страницей, постоянно расположенной по адресу http://www.landgraph.ru/test/test_xdr.php.
<?php //Если к нам приходит запрос от XDomainRequest if($_SERVER['HTTP_XDOMAINREQUEST']=='1') { //Отвечаем клиенту, что мы поддерживаем XDomainRequest header('XDomainRequestAllowed: 1'); echo "XDomainRequest works!"; } else { //Если страница запрошена не через XDomainRequest echo "XDomainRequest dont work!"; } ?> |
По соображениям безопасности XDomainRequest имеет некоторые ограничения. При использовании XDomainRequest протокол обращения к странице, с которой идет запрос, и к загружаемой странице должны быть идентичны. Другими словами, если вы открываете сохраненный на вашем локальном компьютере документ по протоколу file://, а внутри документа есть запрос к странице в Интернете по протоколу http://, то этот запрос не будет выполнен.
Следующая таблица показывает, какие возможны комбинации страниц, с которых разрешен доступ с помощью интерфейса XDomainRequest в другие зоны безопасности.
Откуда \ Куда | Локально | Интранет | Доверенный(Интранет) | Доверенный(Интернет) | Интернет | Ограниченный |
---|---|---|---|---|---|---|
Локально | Разрешено | Разрешено | Разрешено | Разрешено | Разрешено | Запрещено |
Интранет | Запрещено | Разрешено | Разрешено | Разрешено | Разрешено | Запрещено |
Доверенный(Интранет) | Запрещено | Разрешено | Разрешено | Разрешено | Разрешено | Запрещено |
Доверенный(Интернет) | Запрещено | Запрещено | Запрещено | Разрешено | Разрешено | Запрещено |
Internet | Запрещено | Запрещено | Запрещено | Разрешено | Разрешено | Запрещено |
Ограниченный | Запрещено | Запрещено | Запрещено | Запрещено | Запрещено | Запрещено |
Из таблицы видно, что страницы, расположенные локально (http://localhost/), имеют выход на все узлы, кроме запрещенных политикой безопасности. Как видите, через Интернет могут взаимодействовать любые узлы, кроме тех, кому это запрещено текущей политикой безопасности.
Сообщений 7 Оценка 0 Оценить |