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

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

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

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

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

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

<b>/**</b>

<b>* linkdetails.js</b>

<b>*</b>

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

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

<b>* события onmouseover. Обработчик события выполняет HEAD-запрос с помощью</b>

<b>* объекта XMLHttpRequest, чтобы получить сведения о ресурсе, на который</b>

<b>* указывает ссылка, и сохраняет эту информацию в атрибуте title ссылки,</b>

<b>* благодаря чему эта информация будет отображаться во всплывающей подсказке.</b>

<b>*/</b>

<b>whenReady(function() {</b>

<b>  // Поддерживается ли возможность выполнения междоменных запросов?</b>

<b>  var supportsCORS = (new XMLHttpRequest()).withCredentials !== undefined;</b>

<b>  // Обойти в цикле все ссылки в документе</b>

<b>  var links = document.getElementsByTagName('a');</b>

<b>  for(var і = 0; і &lt; links.length; і++) {</b>

<b>    var link = links[і];</b>

<b>    if (!link.href) continue; // Пропустить якоря, не являющиеся ссылками</b>

<b>    if (link.title) continue; // Пропустить ссылки с атрибутом title</b>

<b>    // Если это междоменная ссылка</b>

<b>    if (link.host!==location.host || link.protocol !== location.protocol)</b>

<b>    {</b>

<b>      link.title = &quot;Ссылка на другой сайт&quot;; // Предполагается, что нельзя</b>

<b>                                            // получить дополнительную информацию</b>

<b>      if (!supportsCORS) continue; // Пропустить, если заголовок</b>

<b>                                   // C0RS не поддерживается</b>

<b>      // Иначе есть надежда получить больше сведений о ссылке. Поэтому регистрируем</b>

<b>      // обработчик события, который предпримет попытку сделать это.</b>

<b>    }</b>

<b>    // Зарегистрировать обработчик события, который получит сведения</b>

<b>    // о ссылке при наведении на нее указателя мыши</b>

<b>    if (link.addEventListener)</b>

<b>      link.addEventListener(&quot;mouseover&quot;, mouseoverHandler, false);</b>

<b>    else</b>

<b>      link.attachEvent(&quot;onmouseover&quot;, mouseoverHandler);</b>

<b>  }</b>

<b>  function mouseoverHandler(e) {</b>

<b>    var link = e.target || e.srcElement; // Элемент &lt;a&gt;</b>

<b>    var url = link, liref; // URL-адрес ссылки</b>

<b>    var req = new XMLHttpRequest(); // Новый запрос</b>

<b>    req.open(&quot;HEAD&quot;, url); // Запросить только заголовки</b>

<b>    req.onreadystatechange = function() { // Обработчик события</b>

<b>      if (req.readyState !== 4) return; // Игнорировать незаверш. запросы</b>

<b>      if (req.status === 200) { // В случае успеха</b>

<b>        var type = req.getResponseHeader(&quot;Content-Type&quot;); //Получить</b>

<b>        var size = req.getResponseHeader(&quot;Content-Length&quot;); //сведения</b>

<b>        var date = req.getResponseHeader(&quot;Last-Modified&quot;); //о ссылке</b>