Ich verwende die jQuery-Ajax-Funktionen, um auf einen Webdienst zuzugreifen, aber der Server wird, anstatt eine Antwort mit einem Statuscode zurückzugeben, der ein Problem beschreibt, auf eine Seite mit einem 200-Header umgeleitet, die das Problem beschreibt. Ich kann daran keine Änderungen vornehmen, daher muss ich es irgendwie auf dem Client lösen.
Beispiel: Eine Anfrage geht an eine URL, die nicht gefunden wurde, sodass ich eine 302-Weiterleitung an einen anderen Ort erhalte. Eine neue Anfrage wird gesendet, und ich erhalte ein 200 OK, wodurch verhindert wird, dass der Fehlerrückruf ausgelöst wird.
Gibt es eine Möglichkeit, die Ajax-Anforderung zu verhindern, Weiterleitungen zu folgen und stattdessen einen Rückruf aufzurufen, vorzugsweise die Fehlermethode? Ist es alternativ möglich zu erkennen, ob im Client eine Umleitung stattgefunden hat?
quelle
Antworten:
Ich finde Ihre Frage interessant, aber das Problem insgesamt scheint mir eher ein Missverständnis zu sein. Zumindest werde ich versuchen, mein Verständnis des Problems zu erklären.
Die stille (transparente) Umleitung ist Teil der
XMLHttpRequest
Spezifikation (siehe hier insbesondere die Worte "... folgen Sie transparent der Umleitung ..."). Der Standard erwähnt nur, dass der Benutzeragent (der Webbrowser) bestimmte Arten von automatischen Umleitungen verhindern oder benachrichtigen kann, dies ist jedoch kein Teil vonXMLHttpRequest
. Dies ist Teil der HTTP-Client-Konfiguration (Betriebssystemkonfiguration) oder der Webbrowser-Konfiguration. SiejQuery.ajax
können also keine Option haben, mit der Sie die Umleitung verhindern können.Sie können sehen, dass die HTTP-Umleitung Teil des HTTP-Protokolls und nicht Teil von ist
XMLHttpRequest
. Es befindet sich also auf einer anderen Abstraktionsebene oder dem Netzwerkstapel. Beispielsweise können die Daten von derXMLHttpRequest
vom HTTP-Proxy oder vom lokalen Browser-Cache abgerufen werden und sind Teil des HTTP-Protokolls. Meistens der Server der die Daten bereitstellt, und nicht der Client das Caching beeinflussen.Sie können die Anforderung aus Ihrer Frage mit der Anforderung vergleichen, um zu verhindern, dass sich die IP-Adresse des Webservers oder die IP-Route während der Kommunikation ändert. All die Dinge können in einigen Szenarien interessant sein, aber es gibt Teile einer anderen Ebene des Kommunikationsstapels und können nicht von
jQuery.ajax
oder verwaltet werdenXMLHttpRequest
.Der
XMLHttpRequest
Standard besagt, dass die Client-Konfiguration Optionen enthalten kann, die eine Umleitung verhindern. Im Fall von "Microsoft World", die ich besser kenne, können Sie sich die WinHttpSetOption- Funktion ansehen,WINHTTP_OPTION_DISABLE_FEATURE
mit der die Option mit demWINHTTP_DISABLE_REDIRECTS
Wert festgelegt werden kann. Ein anderer Weg ist die Verwendung derWINHTTP_OPTION_REDIRECT_POLICY
Option mit demWINHTTP_OPTION_REDIRECT_POLICY_NEVER
Wert. Eine weitere Funktion, die man in Windows verwenden kann, ist die WinHttpSetStatusCallback- Funktion, mit der die Rückruffunktion eingestellt werden kann, die einige Benachrichtigungen wie erhalten hatWINHTTP_CALLBACK_FLAG_REDIRECT
.Es ist also möglich, Ihre Anforderungen im Allgemeinen zu implementieren, aber die Lösung ist wahrscheinlich nicht unabhängig vom Betriebssystem oder vom Webbrowser und befindet sich nicht auf der Ebene von
jQuery.ajax
oderXMLHttpRequest
.quelle
Ich glaube nicht, dass es möglich ist. Die zugrunde liegende Bibliothek (XHR) macht die neue Anforderung transparent. Abgesehen davon habe ich in diesen Situationen (normalerweise ein Deal mit Sitzungszeitlimit, der mich zu einer Anmeldeseite führt) einen benutzerdefinierten Antwortheader zurückgesendet. Ich habe auch einen globalen Ajax-Handler eingerichtet, der das Vorhandensein dieses Headers überprüft und bei Vorhandensein angemessen reagiert (z. B. Umleiten der gesamten Seite zum Anmeldebildschirm).
Falls Sie interessiert sind, ist hier der jQuery-Code, den ich für diesen benutzerdefinierten Header beachten muss:
quelle
Ich habe eine Funktion gefunden, mit der überprüft werden kann, ob Ihr Anruf umgeleitet wurde. Es ist xhr.state (): Wenn es "abgelehnt" ist, ist eine Umleitung aufgetreten.
Beispiel mit erfolgreichem Rückruf:
Beispiel mit Fehlerrückruf:
quelle
Ich kann unmöglich die aufschlussreiche Weisheit der vorherigen Codierer ergänzen, die geantwortet haben, aber ich werde einen bestimmten Fall hinzufügen, den andere möglicherweise nützlich finden, um darüber Bescheid zu wissen.
Ich bin auf diese stille 302-Weiterleitung im Kontext von SharePoint gestoßen. Ich habe einen einfachen Javascript-Clientcode, der eine SharePoint-Unterwebsite anpingt. Wenn eine 200-HTTP-Antwort empfangen wird, wird diese über auf diese Website verschoben
window.location
. Wenn es etwas anderes erhält, gibt es dem Benutzer einen Hinweis, dass die Site nicht existiert.Wenn die Site jedoch vorhanden ist, der Benutzer jedoch keine Berechtigung hat, leitet SharePoint stillschweigend zu einer AccessDenied.aspx-Seite weiter. SharePoint hat den HTTP 401-Authentifizierungshandshake bereits auf Server- / Farmebene durchgeführt. Der Benutzer hat Zugriff auf SharePoint. Aber der Zugriff auf die Unterwebsite wird vermutlich über Datenbankflags abgewickelt. Die stille Umleitung umgeht meine "else" -Klausel, sodass ich meinen eigenen Fehler nicht auslösen kann. In meinem Fall ist dies kein Show-Stopper - es ist ein konsistentes vorhersehbares Verhalten. Aber es war ein wenig überraschend und ich habe dabei etwas über HTTP-Anfragen gelernt!
quelle
Ich war an der gleichen Sache interessiert und konnte die von Takman erwähnte
state()
Methode nicht finden und grub ein wenig für mich. Für die Leute, die hier auf der Suche nach einer Antwort auftauchen, sind hier meine Ergebnisse:Wie bereits mehrfach erwähnt, können Sie Weiterleitungen nicht verhindern, aber erkennen. Laut MDN können Sie nach allen Weiterleitungen die
responseURL
von verwendenXMLHttpRequestObject
, die die endgültige URL enthält, von der die Antwort stammt. Die einzige Einschränkung ist, dass es von Internet Explorer nicht unterstützt wird (Edge hat es). Da dasxhr
/jqXHR
in diesuccess
/done
-Funktion von jquery eine Erweiterung des Ist istXMLHttpRequest
, sollte es auch dort verfügbar sein.quelle
Ich nehme an, Sie erhalten eine Antwort von 200, da beim zweiten Mal keine Umleitung erfolgt, da die 404-Seite nicht abläuft und im Cache gespeichert wird. Das heißt, dass der Browser Ihnen die Seite im Cache zum zweiten Mal zur Verfügung stellt. In der Ajax-Abfrage befindet sich eine Eigenschaft "Cache". http://api.jquery.com/jQuery.ajax/
Sie sollten es auf "false" schreiben
quelle
Während es in XmlHttpRequests nicht möglich ist, die Standortumleitung zu deaktivieren , ist dies bei Verwendung von fetch () der Fall :
quelle
Ich bin nicht sicher, ob dies in Ihrem Fall zutrifft, aber Sie können Code schreiben, um auf bestimmte Statuscodes in der AJAX-Funktion zu reagieren.
quelle
In den Anforderungsheadern im Fall einer Ajax-Anforderung haben Sie Folgendes
Nach diesen Kriterien auf der Serverseite können Sie Anforderungen filtern.
quelle