Ich habe also diesen jQuery AJAX-Aufruf und die Antwort kommt vom Server in Form einer 302-Umleitung. Ich möchte diese Umleitung nehmen und in einen Iframe laden, aber wenn ich versuche, die Header-Informationen mit einer Javascript-Warnung anzuzeigen, wird sie als null angezeigt, obwohl Firebug sie korrekt sieht.
Hier ist der Code, wenn es hilft:
$j.ajax({
type: 'POST',
url:'url.do',
data: formData,
complete: function(resp){
alert(resp.getAllResponseHeaders());
}
});
Ich habe nicht wirklich Zugriff auf die serverseitigen Inhalte, um die URL in den Antworttext zu verschieben. Ich weiß, dass dies die einfachste Lösung ist. Daher wäre jede Hilfe beim Parsen des Headers fantastisch.
post
den ursprünglichen Server verwendet und Zieldaten extrahiert, und Front-End-JS fordert diesen Proxyserver für die Zieldaten an. Oder 2) Ändern Sie den Servercode, um CORS zuzulassen.Antworten:
Die Lösung von cballou funktioniert, wenn Sie eine alte Version von jquery verwenden. In neueren Versionen können Sie auch versuchen:
Laut docs ist das XMLHttpRequest-Objekt ab jQuery 1.4 verfügbar.
quelle
Wenn es sich um eine CORS-Anforderung handelt , werden möglicherweise alle Header in Debug-Tools angezeigt (z. B. Chrome-> Inspect Element-> Network). Das xHR-Objekt ruft den Header jedoch nur (via
xhr.getResponseHeader('Header')
) ab, wenn es sich bei einem solchen Header um einen einfachen Antwortheader handelt :Content-Type
Last-modified
Content-Language
Cache-Control
Expires
Pragma
Wenn es nicht in diesem Set enthalten ist, muss es in den Access-Control-Expose-Headern vorhanden sein vom Server zurückgegebenen Headers vorhanden sein.
In Bezug auf den fraglichen Fall kann man, wenn es sich um eine CORS-Anforderung handelt, den
Location
HeaderXMLHttpRequest
nur dann über das Objekt abrufen, wenn und nur wenn auch der folgende Header vorhanden ist:Wenn es sich nicht um eine CORS-Anfrage handelt,
XMLHttpRequest
kann sie problemlos abgerufen werden.quelle
quelle
Die unglückliche Wahrheit über AJAX und die 302-Weiterleitung ist, dass Sie die Header nicht aus der Rückgabe abrufen können, da der Browser sie niemals an die XHR weitergibt. Wenn ein Browser einen 302 sieht, wendet er automatisch die Umleitung an. In diesem Fall würden Sie den Header in Firebug sehen, weil der Browser ihn erhalten hat, aber Sie würden ihn nicht in Ajax sehen, weil der Browser ihn nicht bestanden hat. Aus diesem Grund werden die Erfolgs- und Fehlerbehandlungsroutinen nie aufgerufen. Es wird nur der vollständige Handler aufgerufen.
http://www.checkupdown.com/status/E302.html
Hier sind einige Stackoverflow-Beiträge zu diesem Thema. Einige der Beiträge beschreiben Hacks, um dieses Problem zu umgehen.
So verwalten Sie eine Umleitungsanforderung nach einem jQuery Ajax-Aufruf
Catching 302 FOUND in JavaScript
HTTP-Weiterleitung: 301 (permanent) vs. 302 (temporär)
quelle
Das zugrunde liegende XMLHttpRequest-Objekt, das von jQuery verwendet wird, folgt immer stillschweigend Weiterleitungen, anstatt einen 302-Statuscode zurückzugeben. Daher können Sie die AJAX-Anforderungsfunktionalität von jQuery nicht verwenden, um die zurückgegebene URL abzurufen. Stattdessen müssen Sie alle Daten in ein Formular einfügen und das Formular mit dem
target
Attribut senden, das auf den Wert desname
Attributs des Iframes festgelegt ist:Die
url.do
Seite des Servers wird in den Iframe geladen, aber wenn sein 302-Status eintrifft, wird der Iframe zum endgültigen Ziel umgeleitet.quelle
Versuche dies:
quelle
UPDATE 2018 FÜR JQUERY 3 UND SPÄTER
Ich weiß, dass dies eine alte Frage ist, aber keine der oben genannten Lösungen hat für mich funktioniert. Hier ist die Lösung, die funktioniert hat:
quelle
+1 zu PleaseStand und hier ist mein anderer Hack:
Nachdem ich gesucht und festgestellt hatte, dass die "Cross-Ajax-Anfrage" keine Antwortheader vom XHR-Objekt erhalten konnte, gab ich auf. und verwenden Sie stattdessen iframe.
quelle