Chcę użyć jQuery, aby uzyskać adres URL i wyraźnie sprawdzić, czy odpowiedział przekierowaniem 302, ale nie podążać za przekierowaniem.
$.ajax
Wydaje się, że jQuery zawsze podąża za przekierowaniami. Jak mogę temu zapobiec i zobaczyć przekierowanie bez podążania za nim?
Istnieje wiele pytań związanych z tytułami takimi jak „jquery ajax redirect”, ale wszystkie wydają się dotyczyć osiągnięcia jakiegoś innego celu, a nie tylko bezpośredniego sprawdzania statusu, jaki nadaje serwer.
xhr.getResponseHeader("content-type")
zaczyna się odtext/html
i zawiera słowo kluczowe, takie jak „login”, i w razie potrzeby pokazuję, że „sesja wygasła”. To oczywiście nie jest tak naprawdę odpowiedź, ale obejście.Odpowiedzi:
Żądanie AJAX nigdy nie ma możliwości NIE podążać za przekierowaniem (tj. Musi następować po przekierowaniu). Więcej informacji można znaleźć w tej odpowiedzi https://stackoverflow.com/a/2573589/965648
źródło
Witamy w przyszłości!
W tej chwili mamy właściwość „responseURL” z obiektu xhr. YAY!
Zobacz Jak uzyskać adres URL odpowiedzi w XMLHttpRequest?
Jednak jQuery (przynajmniej 1.7.1) nie daje bezpośredniego dostępu do obiektu XMLHttpRequest. Możesz użyć czegoś takiego:
var xhr; var _orgAjax = jQuery.ajaxSettings.xhr; jQuery.ajaxSettings.xhr = function () { xhr = _orgAjax(); return xhr; }; jQuery.ajax('http://test.com', { success: function(responseText) { console.log('responseURL:', xhr.responseURL, 'responseText:', responseText); } });
To nie jest czyste rozwiązanie i przypuszczam, że zespół jQuery zrobi coś dla responseURL w przyszłych wydaniach.
WSKAZÓWKA : po prostu porównaj oryginalny adres URL z responseUrl. Jeśli jest równy, nie podano przekierowania. Jeśli jest „niezdefiniowany”, to responseUrl prawdopodobnie nie jest obsługiwany. Jednak, jak powiedział Nick Garvey, żądanie AJAX nigdy nie ma możliwości NIE podążania za przekierowaniem, ale możesz rozwiązać szereg zadań za pomocą właściwości responseUrl .
źródło
Podczas gdy inni ludzie, którzy odpowiedzieli na to pytanie, (niestety) mają rację, że te informacje są ukrywane przed nami przez przeglądarkę, pomyślałem, że opublikuję obejście, które wymyśliłem:
Skonfigurowałem aplikację serwera tak, aby ustawić niestandardowy nagłówek odpowiedzi (
X-Response-Url
) zawierający żądany adres URL. Za każdym razem, gdy mój kod Ajax otrzyma odpowiedź, sprawdza, czyxhr.getResponseHeader("x-response-url")
jest zdefiniowany, w takim przypadku porównuje go z adresem URL, którego pierwotnie zażądał$.ajax()
. Jeśli ciągi się różnią, wiem, że nastąpiło przekierowanie, a dodatkowo, do jakiego adresu URL doszliśmy.Ma to tę wadę, że wymaga pomocy po stronie serwera, a także może się zepsuć, jeśli adres URL zostanie zablokowany (z powodu problemów z cytowaniem / kodowaniem itp.) Podczas podróży w obie strony ... ale w 99% przypadków wydaje się, że praca wykonana.
Po stronie serwera moim konkretnym przypadkiem była aplikacja w Pythonie korzystająca z frameworka internetowego Pyramid i użyłem następującego fragmentu kodu:
import pyramid.events @pyramid.events.subscriber(pyramid.events.NewResponse) def set_response_header(event): request = event.request if request.is_xhr: event.response.headers['X-Response-URL'] = request.url
źródło
Możesz teraz użyć API pobierania / zwraca
redirected: *boolean*
źródło