Я использую jQuery для отправки запроса AJAX POST на мой сервер, который может возвращать HTTP-ответ со статусом 302. Затем JavaScript просто отправляет запрос GET на этот URL-адрес, в то время как я хотел бы перенаправить пользователя на URL-адрес в этом ответе. Это возможно?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


function doAjaxCall() {
$.ajaxSetup({complete: onRequestCompleted});
$.get(yourUrl,yourData,yourCallback);
}
function onRequestCompleted(xhr,textStatus) {
if (xhr.status == 302) {
location.href = xhr.getResponseHeader("Location");
}
}
Почитайте сообщение stackoverflow.com/questions/199099/…. Это объясняет небольшую хитрость, позволяющую обойти браузер, автоматически обрабатывающий 302 для ответа ajax.
Это не улавливает ответ 302.
Я так не думаю. W3C говорит, что перенаправления HTTP с определенными кодами состояния, включая 302, должны выполняться прозрачно. Цитируется ниже:
If the response is an HTTP redirect (status code 301, 302, 303 or 307), then it MUST be transparently followed (unless it violates security or infinite loop precautions). Any other error (including a 401) MUST cause the object to use that error page as the response.
В качестве эксперимента я попытался выполнять запросы Ajax из различных браузеров (Firefox 3.5, Chrome, IE8, IE7, IE6) на сервер, выдающий код статуса 302 и показывающий статус в объекте запроса браузера. В каждом случае получалось 200.
Принятый ответ не работает по указанным причинам. Я опубликовал комментарий со ссылкой на вопрос, в котором описывается взлом, позволяющий обойти проблему прозрачной обработки 302 браузером:
Как управлять запросом перенаправления после вызова jQuery Ajax
Однако это немного грязный хакер, и после долгих поисков я нашел то, что считаю лучшим решением - используйте JSON. В этом случае вы можете сделать все ответы на запросы ajax кодом 200, а в теле ответа вы добавите какой-то объект JSON, который ваш обработчик ответов ajax может затем использовать соответствующим образом.
Не очень применимо во многих случаях [если у вас есть авторизация для обработки фреймворка]
@Steg Не думаю, что это хорошее решение. Если у вас много вызовов ajax, нужно ли добавлять логику проверки к каждой функции ajax?
другой вариант - сгенерировать ошибку, но добавить настраиваемый заголовок в ответ сервера, который ваше приложение может использовать, чтобы решить, нужно ли изменить местоположение страницы, которая инициировала вызов ajax, на то, что указывает Location (или что-то еще - в моем случае Я просто обновляю страницу, потому что пытаюсь выявить проблемы, когда пользователь не вошел в систему, а обновление страницы позволяет моему бэкэнду, django, использовать обычный механизм «login_required» для входа пользователя в систему и возврата его на страницу)
Вместо того, чтобы запрашивать код Javascript для обработки 302, было бы лучше вернуть 500 с настраиваемым кодом ошибки + сообщение о событии 302
В моей проблеме причина была:
Я использовал адрес localhost / Главная / Тест для тестирования страницы. Но код запроса ajax с использованием 127.0.0.1/Home/AjaxRequest для параметра url. Если URL-адреса разные, возникает эта ошибка.
может это кому-то поможет :)
по крайней мере, в FF это не работает, поскольку полный обработчик вызывается с окончательным статусом HTTP, который равен 200 для успешного перенаправления (даже если firebug правильно показывает ответ 302, за которым следует запрос 200 GET).