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