Чтение онлайн

на главную - закладки

Жанры

JavaScript. Подробное руководство, 6-е издание
Шрифт:

Пример 18.12. Реализация поддержки предельного времени ожидания

// Выполняет запрос HTTP GET на получение содержимого указанного URL.

// В случае благополучного получения ответа передает содержимое responseText функции

// обратного вызова. Если ответ не пришел в течение указанного времени, выполнение

// запроса прерывается. Броузеры могут возбуждать событие "readystatechange" после

// вызова abort, а в случае получения части ответа свойство status может даже

// свидетельствовать об успехе, поэтому необходимо установить флаг, чтобы избежать

// вызова функции в случае получения части ответа при прерывании запроса по превышению

// времени ожидания. Эта проблема не наблюдается при использовании события load,

function timedGetText(url, timeout, callback) {

var request = new XMLHttpRequest; // Создать новый запрос,

var timedout = false; // Истекло ли время ожидания.

// Запустить таймер, который прервет запрос по истечении

// времени, заданного в миллесекундах.

var timer = setTimeout(function { // Запустить таймер. Если сработает,

timedout = true; // установить флаг

request.abort; // и прервать запрос.

};

timeout); // Интервал времени ожидания

request.open( "GET", url); // Указать URL запроса

request.onreadystatechange = function { // Обработчик события.

if (request.readyState !== 4) return; // Игнорировать незаконч. запрос

if (timedout) return; // Игнорировать прерв. запрос

clearTimeout(timer); // Остановить таймер,

if (request.status === 200) // В случае успеха

callback(request.responseText); // передать ответ функции.

};

request.send(null); // Отправить запрос

}

18.1.6. Выполнение междоменных НТТР-запросов

Будучи субъектом политики общего происхождения (раздел 13.6.2), объект

XMLHttpRequest
может использоваться для отправки HTTP-запросов только серверу, откуда был получен использующий его документ. Это ограничение закрывает дыру безопасности, но также предотвращает возможность использования объекта для вполне законных междоменных запросов. Элементы
<form>
и
<iframe>
позволяют указывать URL-адреса с другими доменными именами, и в этих случаях броузеры будут отображать документы, полученные из других доменов. Но из-за ограничений политики общего происхождения броузер не позволит оригинальному сценарию исследовать содержимое стороннего документа. При использовании объекта
XMLHttpRequest
содержимое документа всегда доступно через свойство
responseText
, поэтому политика общего происхождения не позволяет объекту
XMLHttpRequest
выполнять междоменные запросы. (Обратите внимание, что элемент
<script>
в действительности никогда не был субъектом политики общего происхождения: он будет загружать и выполнять любые сценарии, независимо от их происхождения. Как будет показано в разделе 18.2, такая свобода выполнения междоменных запросов делает элемент
<script>
привлекательной альтернативой Ajax-транспорту на основе объекта
XMLHttpRequest
.)

Спецификация «ХНН2» позволяет выполнять междоменные запросы к другим веб-сайтам, указанным в заголовке «CORS» (Cross-Origin Resource Sharing) HTTP-ответа. На момент написания этих строк текущие версии броузеров Firefox, Safari и Chrome поддерживали заголовок «CORS», а версия IE8 поддерживала собственный объект

XDomainRequest
, который здесь не описывается. Веб-программисту при этом не придется делать ничего особенного: если броузер поддерживает заголовок «CORS» для объекта
XMLHttpRequest
и если вы пытаетесь выполнить междоменный запрос к веб-сайту, доступ к которому разрешен в заголовке «CORS», политика общего происхождения просто не будет препятствовать выполнению междоменного запроса, и все будет работать само собой.

Хотя при наличии поддержки заголовка «CORS» не требуется предпринимать какие-то дополнительные шаги для выполнения междоменных запросов, тем не менее имеются некоторые детали, касающиеся безопасности, которые желательно понимать. Во-первых, при передаче имени пользователя и пароля методу

open
объекта
XMLHttpRequest
они не будут передаваться в междоменных запросах (в противном случае это дало бы злоумышленникам возможность взламывать пароли). Кроме того, междоменные запросы обычно не допускают включение в них никакой другой информации, подтверждающей подлинность пользователя: cookies и HTTP-лексемы аутентификации обычно не передаются в составе запроса, а любые cookies, полученные в результате выполнения междоменного запроса, уничтожаются. Если для выполнения междоменного запроса требуется выполнить аутентификацию пользователя, перед вызовом метода
send
следует установить свойство
withCredentials
объекта
XMLHttpRequest
в значение true. Проверка наличия свойства
withCredentials
позволит определить наличие поддержки заголовка «CORS» в броузере, хотя обычно этого не требуется.

В примере 18.13 приводится ненавязчивый JavaScript-код, использующий объект

XMLHttpRequest
для выполнения HEAD-запросов HTTP с целью получения информации о типах, размерах и датах последнего изменения ресурсов, на которые ссылаются элементы
<а>.
HEAD-запросы выполняются по требованию, а полученная информация отображается во всплывающих подсказках. В этом примере предполагается, что информация не будет доступна для междоменных ссылок, тем не менее в броузерах с поддержкой заголовка «CORS» все равно будут выполняться попытки получить ее.

Пример 18.13. Получение информации о ссылках с помощью HEAD-запросов при наличии поддержки заголовка «CORS»

/**

* linkdetails.js

*

* Этот модуль в стиле ненавязчивого JavaScript отыскивает все элементы <а>

* с атрибутом href и без атрибута title, и добавляет в них обработчики

Поделиться:
Популярные книги

За Горизонтом

Вайс Александр
8. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
За Горизонтом

Бастард Бога (Дилогия)

Матвеев Владимир
Фантастика:
альтернативная история
5.11
рейтинг книги
Бастард Бога (Дилогия)

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Вернувшийся: Посол. Том IV

Vector
4. Вернувшийся
Фантастика:
космическая фантастика
киберпанк
5.00
рейтинг книги
Вернувшийся: Посол. Том IV

Четники. Королевская армия

Тимофеев Алексей Юрьевич
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Четники. Королевская армия

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

Газлайтер. Том 22

Володин Григорий Григорьевич
22. История Телепата
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Газлайтер. Том 22

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Бастард Императора. Том 14

Орлов Андрей Юрьевич
14. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 14

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

Вперед в прошлое 2

Ратманов Денис
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 2

Падение Софии (русский роман)

Хаецкая Елена Владимировна
Фантастика:
фэнтези
5.00
рейтинг книги
Падение Софии (русский роман)