Возврат перенаправления в ответ на запрос XHR

Ответы:

216

Что произойдет, если браузер получит ответ перенаправления на запрос ajax?

Если сервер отправляет переадресацию (ответ 302 плюс заголовок Location:), за перенаправлением автоматически следует браузер. Ответ на второй запрос (при условии, что он также не является другим перенаправлением) - это то, что предоставляется вашей программе.

На самом деле, у вас нет возможности определить, произошел ли ответ 302. Если перенаправление 302 приводит к 200, то ваша программа действует так же, как если бы исходный запрос приводил непосредственно к 200.

Это был мой опыт и поведение, описанное в спецификации .

Обновление 2016 года: время прошло, и хорошая новость заключается в том, что новый API fetch () специально призван обеспечить более детальный контроль над обработкой перенаправлений с поведением по умолчанию, аналогичным XHR. Тем не менее, это работает только тогда, когда fetch () реализован изначально . Версии функции fetch () , которые основаны на XHR, по- прежнему имеют ограничения XHR . К счастью, поддержка родного браузера, похоже, завершается неплохо.

Greim
источник
47
Интересно, что я пришел к этому, потому что я нахожусь в ситуации, когда перенаправление явно не выполняется ... это происходит, когда перенаправление нарушает ту же политику происхождения.
Гас
4
@ Гас, что, вероятно, логично
Дмитрий
1
В случае перенаправления на 401 (или любую ошибку 4xx или 5xx) я бы предположил, что ваша программа будет вести себя так, как если бы запрос вел непосредственно к 401. Разве это не то, что вы видите?
Грейм
2
RESTful API может отправлять 201 и заголовок Location после запроса POST; см. restapitutorial.com/lessons/httpmethods.html .
1
Обновление 2019: выборка не работает, как мы ожидали 3 года назад):
lcjury
7

ajax-requestБудет следовать , что перенаправлять AFAIK. Фактическим содержанием ( .responseText, .responseXML) будет содержимое страницы, на которую вы перенаправлены.

Возможно, вы сможете перехватить перенаправление ( status-code, location-header) на readyState2 или 3, но не уверены в этом.

Jishi
источник
Нет, все эти штаты имеют одинаковый статус. Даже значение getAllResponseHeaders()равно.
Себастьян