Поймать 302 НАЙДЕН в JavaScript - PullRequest
35 голосов
/ 17 декабря 2008

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

Ответы [ 6 ]

22 голосов
/ 08 октября 2009

Принятый ответ не работает по указанным причинам. Я разместил комментарий со ссылкой на вопрос, описывающий хак, чтобы обойти проблему прозрачности обработки 302 браузером:

Как управлять запросом на перенаправление после вызова jQuery Ajax

Однако, это немного грязный взлом, и после долгих размышлений я нашел то, что считаю лучшим решением - используйте JSON . В этом случае вы можете сделать так, чтобы все ответы на ajax-запросы имели код 200, и в теле ответа вы добавляете какой-то объект JSON, который ваш обработчик ответов ajax может затем использовать соответствующим образом.

6 голосов
/ 10 сентября 2009

Я так не думаю. W3C говорит, что перенаправления HTTP с определенными кодами состояния, включая 302, должны прозрачно соблюдаться. Цитируется ниже:

Если ответ является перенаправлением HTTP (код состояния 301, 302, 303 или 307), то он ДОЛЖЕН быть прозрачным (если он не нарушает безопасность или меры предосторожности бесконечного цикла). Любая другая ошибка (включая 401) ДОЛЖЕН заставить объект использовать эту страницу ошибки в качестве ответа.

В качестве эксперимента я попытался выполнить запросы Ajax из различных браузеров (Firefox 3.5, Chrome, IE8, IE7, IE6) к серверу, предоставляющему код состояния 302 и показывающему состояние в объекте запроса браузера. В каждом случае это было 200.

2 голосов
/ 18 февраля 2011

В моей проблеме причина была:

Я использовал localhost / Home / Test адрес для тестирования страницы. Но код запроса ajax использует 127.0.0.1 / Home / AjaxRequest для параметра url. Когда URL-адреса отличаются, эта ошибка возникает.

может быть, это кому-нибудь поможет :)

0 голосов
/ 17 января 2013

Лучшее решение:

установить переменную с атрибутом любого объекта, например

<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-адрес атрибута, эта ошибка не происходит

0 голосов
/ 18 сентября 2010

Вместо того, чтобы запрашивать код Javascript для обработки 302, было бы лучше вернуть 500 с пользовательским кодом ошибки + сообщение о событии 302

0 голосов
/ 17 декабря 2008
function doAjaxCall() {
   $.ajaxSetup({complete: onRequestCompleted});
   $.get(yourUrl,yourData,yourCallback);
}

function onRequestCompleted(xhr,textStatus) {
   if (xhr.status == 302) {
      location.href = xhr.getResponseHeader("Location");
   }
}
...