Как поймать ожидаемый (и предполагаемый) 302 ответ Ajax? - PullRequest
4 голосов
/ 05 мая 2010

Итак, если вы посмотрите на мой предыдущий вопрос об автообнаружении Exchange, вы увидите, что самый простой способ получить URL-адрес автообнаружения - это отправить незащищенный, не прошедший проверку подлинности GET запрос к серверу, аля:

http://autodiscover.exchangeserver.org/autodiscover/autodiscover.xml

Сервер ответит перенаправлением 302 с правильным URL-адресом в заголовке Location.

Сначала я пробую что-то действительно простое с расширением Chrome, где у меня есть:

if (req.readyState==4 && req.status==302) {
    return req.getResponseHeader("Location");
}

С помощью другого вызова ajax, настроенного с полной записью XML и учетными данными пользователя,

Но вместо этого Chrome зависает в этот момент, и взгляд на панель разработчика показывает, что он не возвращает ответ, а вместо этого ведет себя так, как будто ответ не был получен, показывая при этом

Uncaught Error: NETWORK_ERR: XMLHttpRequest Exception 101

в журнале ошибок.

На мой взгляд, обращение к точному статусу ответа - это то же самое, что и его "перехват", но я не уверен, что проблема в Chrome / WebKit или в том, как XHR-запросы всегда обрабатывают перенаправления.

Я не уверен, как это перехватить, чтобы я мог получить заголовки из ответа.

Или можно было бы настроить вторичный XHR таким образом, чтобы при получении 302 он отправлял совершенно другой запрос?

Быстрое обновление

Я просто изменил его, чтобы он не проверял код ответа:

if (req.readyState==4) {
    return req.getResponseHeader("Location");
}

и вместо этого, когда я предупреждаю значение, оно null. и все еще та же ошибка и нет ответа в консоли разработчика. ТАК что кажется, что он или не отслеживает 302 ответа как ответы, или что-то происходит после того, как этот ответ стирает этот ответ?

1 Ответ

3 голосов
/ 05 мая 2010

См. документы w3c на xhr : XHR либо прозрачно выполнит перенаправление, либо выдаст сетевую ошибку (например, то, что вы видите в Chrome), в зависимости от того, находится ли пункт назначения перенаправления на том же Происхождение как исходный запрос. Таким образом, ваш код действительно не имеет возможности перехватить ответ 302. Вот почему заголовок ответа «Местоположение» не установлен: в этот момент вы проверяете заголовки окончательного ответа, а не 302.

...