Подтвердить что ты не робот

Самый первый XMLHttpRequest терпит неудачу, но только на IE9

У меня есть сайт, на котором я вводил имя пользователя/пароль и нажимаю кнопку входа. Кнопка login делает объект XMLHttpRequest и запускает его.

В Chrome, Firefox, Opera, Safari, устройствах Android, устройствах iOS это прекрасно работает. IE9 будет работать, если я нахожусь на HTTP-адресе и не использую HTTPS.

В HTTPS IE9 ведет себя следующим образом:

Первый запрос на вход никогда ничего не возвращает. Экран F12 показывает мой запрос на вход на вкладке сети, и все выглядит правильно. Вкладка сценариев никогда не выдает ошибку. Просто ничего не происходит.

Здесь сумасшедшая часть:  - Если я второй раз нахожу логин, он действительно работает.  - Если я нажму обновить в браузере, а затем войдите в систему, это тоже сработает!

Я делаю запрос следующим образом:

   var x = new XMLHttpRequest();
   x.open("POST", "/Relative/URL/Path", true);
   x.setRequestHeader("Content-Type", "text/plain");
   x.onreadystatechange = function () {
      if ((x.readyState == 4) && (x.status == 200)) {
            // handle callback
      }
   }
   x.send(my request);

Если это не удается, отладчик перейдет из строки x.send() в код onreadystatechange. ReadyState будет 1. Это будет последнее, что я могу отлаживать, потому что ничего не происходит.

Любые идеи будут чрезвычайно оценены.

[EDIT]: Я позволю одному из запросов пойти посмотреть, что произойдет. Событие onreadystatechange снова запущено с readyState = 4 и status = 12152. Сетевой вид на экране IE9 F12 показывает результат как "Отмена" и время, затраченное на 1589.07 секунд. В результате поиска в Google это означает, что соединение было закрыто на сервере.

[РЕДАКТИРОВАТЬ 2]: на основании комментария ниже я переустановил этот код, чтобы просто использовать метод jQuery ajax(). Я думал, что это может иметь шанс устранить плохой код с моей стороны. Нет такой удачи. Такое же поведение происходит.

   $.ajax({
      "url": sUrl,
      "success": function (data, textStatus, x) {
         workerCallback(data, id, "");
      },
      "error": function (x, testStatus, errorThrown) {
         workerCallback("nc", id, errorThrown);
      },
      "contentType": "text/plain",
      "data": JSON.stringify(req),
      "dataType": "json",
      "timeout": 1600000,
      "type": "POST"
   });

[ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ:] Я обновил код. Если произойдет тайм-аут, я просто отправлю тот же запрос - только один раз. Довольно хак, но он работает. Если кто-либо не найдет решение, я разделить щедрость между несколькими полезными идеями, которые у людей были ниже.

4b9b3361

Ответ 1

Это похоже на странную проблему, и ее трудно проверить, не выкапывая код на сайте https.

Если вы хотите быстро исправить, вы можете попробовать выполнить первоначальный (фиктивный) запрос, а затем прервать его с помощью короткого setTimeout и сделать второй (реальный) запрос.

В соответствии с вашим описанием он должен работать.

Ответ 2

во время отладки по первому запросу это произошло через

enter image description here

У этой связанной ошибки есть связанная запись... IE 9 Ошибка Javascript c00c023f

Автор добавляет следующее в обработчик onreadystatechange

if (xmlHttpRequest.aborted==true) { 
  stopLoadAnimation();
  return;
}

Это может помочь вам в правильном направлении.

Ответ 3

  • Тайм-ауты предотвращают завершение запроса в readyState 1, и после этого он заканчивается из-за обнюхивания содержимого.

  • Настроить аутентификацию клиента SSL в форме входа в систему с помощью конфигурации веб-сервера

  • Вставьте скрытый элемент (например, изображение), который ссылается на URL-адрес, для которого требуется аутентификация SSL-клиента

  • Используйте гиперссылку относительного gif-протокола, например //example.com/image.gif, чтобы избежать уязвимости SEC7111 .

  • URL-адрес открытого метода соответствует домену при использовании HTTP, но не HTTPS, что приводит к сбою запроса, но последующие запросы возвращаются к политике зоны безопасности

  • Используйте сравнение между window.location.protocol и document.location.protocol, чтобы проверить, выполняется ли script в том же контексте, что и страница

  • Отправка JSON в виде типа MIME text/plain может вызвать обнюхивание содержимого

  • Сравните принять заголовок между запросами, которые не соответствуют тем, которые преуспевают

  • Кэширование HTTPS может быть проблемой

  • Возможно, необходимо установить заголовок подключения

  • Proxy может быть проблема

  • начальный заголовок значения ответов могут быть слишком большими (например, описание статуса HTTP имеет ограничение в 512 символов)

  • document.readystate может быть неполным по первоначальному запросу, что вызывает преждевременное выполнение проблемы

  • Проверка отзыва сертификатов может блокировать начальный JSON POST, но разрешать последующие запросы после обратного вызова GET

  • свойства readyState и status должны ссылаться с помощью области обратного вызова, а не переменной x, чтобы избежать использования области закрытия:

    function cb()
      {
      if ( (this.readyState === 4) && (this.status === 200) ) 
        {
        // handle callback
        }
      }

    onreadystatechange = cb;