Настройка заголовка авторизации в XMLHttpRequest изменяет HTTP-глагол

Сегодня я обнаружил странное поведение XMLHttpRequest. Когда я звоню в службу GET, я обнаружил, что если я не настрою заголовок авторизации, запрос от firefox будет таким же. Но если я добавлю заголовок "Авторизация", то firefox сначала отправит запрос с помощью "ОПЦИИ", затем отправит запрос "GET".

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

Вот мой код 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);
          }

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

enter image description here

enter image description here

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

enter image description here

Ответ 1

Запрос HTTP OPTIONS используется для предпросмотра запроса перекрестного происхождения GET перед его отправкой.

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

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

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

Подробнее здесь

Спецификация запроса на перекрестный запрос с предполетью