Перехват 302, НАЙДЕННЫЙ в JavaScript
-
21-08-2019 - |
Вопрос
Я использую jQuery для отправки запроса AJAX POST на мой сервер, который может возвращать HTTP-ответ со статусом 302.Затем JavaScript просто отправляет GET-запрос на этот URL, в то время как я хотел бы перенаправить пользователя на URL в этом ответе.Возможно ли это?
Решение
Принятый ответ не работает по указанным причинам.Я опубликовал комментарий со ссылкой на вопрос, в котором описывался взлом, позволяющий обойти проблему прозрачной обработки 302 браузером:
Как управлять запросом перенаправления после вызова jQuery Ajax
Тем не менее, это немного грязный взлом, и после долгих поисков я нашел то, что, на мой взгляд, является лучшим решением - использовать JSON.В этом случае вы можете сделать так, чтобы все ответы на запросы ajax содержали код 200, и в теле ответа вы добавляете какой-то объект JSON, который ваш обработчик ответов ajax затем может использовать соответствующим образом.
Другие советы
Я так не думаю.В W3C говорит, что HTTP-перенаправления с определенными кодами состояния, включая 302, должны выполняться прозрачно.Цитируется ниже:
Если ответ представляет собой HTTP-перенаправление (код состояния 301, 302, 303 или 307), то его выполнение ДОЛЖНО быть прозрачным (если это не нарушает меры безопасности или меры предосторожности в отношении бесконечного цикла).Любая другая ошибка (включая 401) ДОЛЖНА приводить к тому, что объект использует эту страницу с ошибкой в качестве ответа.
В качестве эксперимента я попытался выполнять Ajax-запросы из различных браузеров (Firefox 3.5, Chrome, IE8, IE7, IE6) к серверу, предоставляющему код состояния 302 и отображающему статус в объекте запроса браузера.В каждом случае оно отображалось как 200.
В моей проблеме причиной было:
я использовал локальный хостинг / Главная страница / Тест адреса для тестирования страницы.Но код запроса ajax с использованием 127.0.0.1/Главная страница/ajaxRequest для параметра url.Когда URL-адреса отличаются, возникает эта ошибка.
может быть, это кому-то поможет :)
Вместо того, чтобы запрашивать код Javascript для обработки 302, было бы лучше вернуть 500 с пользовательским кодом ошибки + сообщение о событии 302
function doAjaxCall() {
$.ajaxSetup({complete: onRequestCompleted});
$.get(yourUrl,yourData,yourCallback);
}
function onRequestCompleted(xhr,textStatus) {
if (xhr.status == 302) {
location.href = xhr.getResponseHeader("Location");
}
}
Лучшим решением является:
задайте переменную с атрибутом любого объекта пример
<html>
·
·
<span url="http://www.google.com"></span>
·
·
</html>
$('.example').on('click', function(){
$url = $(this).attr('url');
$.get($url, function(data){ alert(data); })
})
Если URL задан непосредственно в js, вы должны найти ошибку 302, я не знаю, из-за чего возникает эта ошибка, но если вы получаете URL атрибута, эта ошибка не встречается