Erkennen einer Weiterleitung in einer Ajax-Anfrage?

94

Ich möchte jQuery verwenden, um eine URL abzurufen und explizit zu überprüfen, ob sie mit einer 302-Umleitung geantwortet hat, aber nicht der Umleitung folgen.

jQuery's $.ajaxscheint immer Weiterleitungen zu folgen. Wie kann ich dies verhindern und die Weiterleitung anzeigen, ohne sie zu befolgen?

Es gibt verschiedene Fragen mit Titeln wie "jquery ajax redirect", aber alle scheinen das Erreichen eines anderen Ziels zu beinhalten, anstatt nur den Status eines Servers direkt zu überprüfen.

kdt
quelle

Antworten:

87

Die AJAX-Anforderung hat niemals die Möglichkeit, der Umleitung NICHT zu folgen (dh sie muss der Umleitung folgen). Weitere Informationen finden Sie in dieser Antwort unter https://stackoverflow.com/a/2573589/965648

Nick Garvey
quelle
41

Willkommen in der Zukunft!

Im Moment haben wir eine "responseURL" -Eigenschaft vom xhr-Objekt. YAY!

Siehe Wie erhalte ich eine Antwort-URL in XMLHttpRequest?

JQuery (mindestens 1.7.1) gewährt jedoch keinen direkten Zugriff auf das XMLHttpRequest-Objekt. Sie können so etwas verwenden:

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);
  }
});

Es ist keine saubere Lösung und ich nehme an, dass das jQuery-Team in zukünftigen Versionen etwas für responseURL machen wird.

TIPP : Vergleichen Sie einfach die ursprüngliche URL mit responseUrl. Wenn es gleich ist, wurde keine Weiterleitung gegeben. Wenn es "undefiniert" ist, wird responseUrl wahrscheinlich nicht unterstützt. Wie Nick Garvey sagte, hat die AJAX-Anfrage jedoch nie die Möglichkeit, der Umleitung NICHT zu folgen. Sie können jedoch eine Reihe von Aufgaben mithilfe der responseUrl- Eigenschaft lösen .

Riki_tiki_tavi
quelle
1
Um weitere Ressourcen zu diesem Attribut hinzuzufügen - MDN-Seite in XHR.responseURL - scheint die allgemeine Unterstützung auf MSIE zu warten, die es nur in Edge / 14 hinzugefügt hat.
Eli Collins
Vielen Dank ! Sehr nützlich
Gautier
Ich habe festgestellt, dass mit diesem Code $ .ajax ({url: 'someurl', xhrFields: {withCredentials: true}}) einen Fehler in Internet Explorer auslöst, da die Funktion _orgAjax von der Variablen 'this' abhängt, die in $ .ajaxSettings aufgelöst wird Objekt. Wenn dies nicht der Fall ist, erstellt jQuery ein ActiveX IXMLHTTPRequest-Objekt anstelle eines XMLHttpRequest-Objekts, das die withCredentials-Eigenschaft nicht unterstützt. Ich habe dies behoben, indem ich xhr = _orgAjax.call ($. AjaxSettings) aufgerufen habe. anstelle von xhr = _orgAjax (); Ich hoffe das hilft jemandem.
StephenKC
11

Während die anderen Leute, die diese Frage beantwortet haben, (leider) richtig sind, dass diese Informationen vom Browser vor uns verborgen werden, dachte ich, ich würde eine Problemumgehung veröffentlichen, die ich mir ausgedacht habe:

Ich habe meine Server-App so konfiguriert, dass ein benutzerdefinierter Antwortheader ( X-Response-Url) festgelegt wird, der die angeforderte URL enthält. Immer wenn mein Ajax-Code eine Antwort erhält, prüft er, ob er xhr.getResponseHeader("x-response-url")definiert ist. In diesem Fall vergleicht er ihn mit der URL, über die er ursprünglich angefordert hat $.ajax(). Wenn sich die Zeichenfolgen unterscheiden, weiß ich, dass es eine Weiterleitung gab und zusätzlich, zu welcher URL wir tatsächlich gekommen sind.

Dies hat den Nachteil, dass eine serverseitige Hilfe erforderlich ist, und kann auch ausfallen, wenn die URL während des Roundtrips (aufgrund von Zitier- / Codierungsproblemen usw.) beschädigt wird. In 99% der Fälle scheint dies jedoch der Fall zu sein die Arbeit erledigt.


Auf der Serverseite war mein spezieller Fall eine Python-Anwendung, die das Pyramid-Webframework verwendet, und ich habe das folgende Snippet verwendet:

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
Eli Collins
quelle
Es ist in der Tat wahr, dass es keine Möglichkeit gibt zu wissen, ob es eine Weiterleitung gibt, ohne sie zu nehmen. Aber vielleicht kann der Vergleich der erwarteten Header-URL mit der umgeleiteten URL in diesem Moment eine Problemumgehung für mich sein. Vielen Dank für die Idee
Sergio A.
4

Sie können nun API holen / Zurückgegebenredirected: *boolean*

fvrab
quelle