Вопрос по html, firefox, javascript – Установка заголовка авторизации в XMLHttpRequest изменяет глагол HTTP

10

Сегодня я обнаружил странное поведение XMLHttpRequest. Когда я звоню в службу GET, я обнаружил, что если я не установил заголовок авторизации, запрос от Firefox будет таким же. Но если я добавлю заголовок «Авторизация», Firefox сначала отправит запрос с «OPTIONS», а затем отправит запрос «GET».

Я знаю, что глагол "OPTIONS" должен обрабатываться на стороне сервера, но мне было просто интересно, почему XMLHttpRequest ведет себя так. Хотя это междоменный запрос, почему браузер сначала отправляет запрос «OPTIONS». Почему добавление заголовка «Авторизация» меняет поведение.

Вот мой код Javascript и отчет инспектора Fidler.

    var  xmlhttp = new XMLHttpRequest();
    var url = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    xmlhttp.open('GET',url,true);
    xmlhttp.setRequestHeader("Authorization", "xxxxxxxxxxxxxxxxxxx");
    xmlhttp.send(null);
    xmlhttp.onreadystatechange = function() {
            alert("OnReadystatechange + " + xmlhttp.readyState + " " + xmlhttp.status);
           if (xmlhttp.readyState == 4) {
              if ( xmlhttp.status == 200) {

                   }
                   else {

                   }
             }
             else
                   alert("Error ->" + xmlhttp.responseText);
          }

И ответ Fiddler с заголовком авторизации

Но когда я не добавляю заголовок авторизации, браузер напрямую отправляет запрос GET без запроса OPTIONS.

Ваш Ответ

1   ответ
12

OPTIONS запрос используется для «предварительной проверки» перекрестного источникаGET запрос, прежде чем фактически отправить его.

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

Он использует методы, отличные от GET, HEAD или POST. Кроме того, если POST используется для отправки данных запроса с Content-Type, отличным от
application / x-www-form-urlencoded, multipart / form-data или
текст / обычный, например если запрос POST отправляет полезную нагрузку XML
сервер использует application / xml или text / xml, тогда запрос
preflighted.Он устанавливает любой заголовок, который не считается простым. Заголовок называется простым заголовком, если имя поля заголовка является ASCII-регистронезависимым совпадением дляпринимать, Accept-Language, или жеContent-Language или если это ASCII регистронезависимое совпадение дляТип содержимого и значение поля медиа типа заголовка (исключая параметры) является ASCII-регистронезависимым соответствием дляприменение / х-WWW-форм-urlencoded, многочастному / форм-данных,, или жетекст / обычный.

Таким образом, в вашем случае установка заголовка авторизации приводит к тому, что запрос предварительно просвечивается, следовательно,OPTIONS запрос.

Больше информации здесь

Спекуляция на запросе перекрестного происхождения с предпечатной проверкой

Я также не понимаю, почему авторизация в контексте CORS рассматривается как «настраиваемый заголовок», хотя она явно является частьюпротокол http, Это означает, что в сценариях CORS, где вы используете аутентификацию токена (что, я считаю, является своего рода наилучшей практикой в ​​любом сценарии CORS), по существу,каждый Запрос, включая все простые запросы GET, будет предварительно обработан и, как следствие, займет значительно больше времени. Vincent Sels
Кажется так. Иначе это не имело никакого смысла. Я думал, что этот заголовок является стандартным заголовком, как упоминалосьВот, В любом случае, большое спасибо за информацию. Я новичок в Javascript. Ссылка, которую вы упомянули, действительно очень помогла мне понять предполетный запрос. Gulshan
@levi: это было бы неплохо, но URL-адрес запроса должен быть точно таким же,включая параметры URLкак определеноСпецификации W3C CORS: "Значение поля url является чувствительным к регистру совпадением для URL запроса". Это означает, что на практике эти предварительные запросы get практически никогда не кэшируются ... Vincent Sels
Да, я понимаю предполетную заявку. Но просто интересно, почему добавление заголовка Authorization делает предполетный запрос. Ни одно из двух требований (как указано в ссылке) здесь не выполняется. Gulshan

Похожие вопросы