1532 Stimmen

Wie man eine Umleitungsanfrage nach einem jQuery Ajax-Aufruf verwaltet

Ich benutze $.post() um ein Servlet mit Ajax aufzurufen und dann das resultierende HTML-Fragment zu verwenden, um eine div Element auf der aktuellen Seite des Benutzers. Wenn die Sitzung jedoch beendet wird, sendet der Server eine Umleitungsanweisung, um den Benutzer zur Anmeldeseite zu schicken. In diesem Fall ersetzt jQuery das div Element mit dem Inhalt der Anmeldeseite und zwingt die Augen des Benutzers zu einem seltenen Anblick.

Wie kann ich eine Redirect-Direktive aus einem Ajax-Aufruf mit jQuery 1.2.6 verwalten?

1 Stimmen

(nicht eine Antwort als solche) - Ich habe dies in der Vergangenheit durch Bearbeiten der Jquery-Bibliothek und Hinzufügen einer Prüfung für die Login-Seite auf jedem XHR abgeschlossen getan. Nicht die beste Lösung, weil es jedes Mal getan werden müsste, wenn Sie aktualisieren, aber es löst das Problem.

1 Stimmen

Siehe dazugehörige Frage: stackoverflow.com/questions/5941933/

0 Stimmen

El HttpContext.Response.AddHeader und prüfen Sie den Erfolg von ajaxsetup

21voto

morten.c Punkte 3316

Eine andere Lösung, die ich gefunden habe (besonders nützlich, wenn man ein globales Verhalten einstellen möchte), ist die Verwendung der $.ajaxsetup() Methode zusammen mit dem statusCode Eigenschaft . Wie bereits erwähnt, sollten Sie keinen Redirect-Statuscode verwenden ( 3xx ), verwenden Sie stattdessen eine 4xx Statuscode und behandeln den Redirect clientseitig.

$.ajaxSetup({ 
  statusCode : {
    400 : function () {
      window.location = "/";
    }
  }
});

Ersetzen Sie 400 mit dem Statuscode, den Sie behandeln wollen. Wie bereits erwähnt 401 Unauthorized könnte eine gute Idee sein. Ich verwende die 400 da sie sehr unspezifisch ist und ich die 401 für spezifischere Fälle (wie falsche Anmeldedaten). Anstatt direkt weiterzuleiten, sollte Ihr Backend also eine 4xx Fehlercode, wenn die Sitzung eine Zeitüberschreitung aufweist und Sie die Umleitung clientseitig bearbeiten. Funktioniert perfekt für mich auch mit Frameworks wie backbone.js

0 Stimmen

Wo soll die Funktion auf der Seite erwähnt werden?

0 Stimmen

@Vikrant Wenn ich Ihre Frage richtig verstehe, können Sie die Funktion direkt nach dem Laden von jQuery und vor dem Ausführen der eigentlichen Anfragen aufrufen.

20voto

Rob Punkte 2326

Die meisten der angegebenen Lösungen verwenden eine Umgehung, indem sie einen zusätzlichen Header oder einen unangemessenen HTTP-Code verwenden. Diese Lösungen funktionieren höchstwahrscheinlich, sind aber ein wenig "hakelig". Ich habe eine andere Lösung gefunden.

Wir verwenden WIF, das so konfiguriert ist, dass es bei einer 401-Antwort eine Umleitung vornimmt (passiveRedirectEnabled="true"). Die Weiterleitung ist nützlich bei der Bearbeitung normaler Anfragen, funktioniert aber nicht bei AJAX-Anfragen (da die Browser den 302/redirect nicht ausführen).

Mit dem folgenden Code in Ihrer global.asax können Sie die Umleitung für AJAX-Anfragen deaktivieren:

    void WSFederationAuthenticationModule_AuthorizationFailed(object sender, AuthorizationFailedEventArgs e)
    {
        string requestedWithHeader = HttpContext.Current.Request.Headers["X-Requested-With"];

        if (!string.IsNullOrEmpty(requestedWithHeader) && requestedWithHeader.Equals("XMLHttpRequest", StringComparison.OrdinalIgnoreCase))
        {
            e.RedirectToIdentityProvider = false;
        }
    }

Damit können Sie 401-Antworten für AJAX-Anfragen zurückgeben, die Ihr Javascript dann durch Neuladen der Seite verarbeiten kann. Beim Neuladen der Seite wird eine 401-Antwort ausgegeben, die von WIF verarbeitet wird (und WIF leitet den Benutzer zur Anmeldeseite um).

Ein Beispiel-Javascript zur Behandlung von 401-Fehlern:

$(document).ajaxError(function (event, jqxhr, settings, exception) {

    if (jqxhr.status == 401) { //Forbidden, go to login
        //Use a reload, WIF will redirect to Login
        location.reload(true);
    }
});

0 Stimmen

Gute Lösung. Danke!

20voto

Timmerz Punkte 5871

Ich habe eine einfache Lösung, die bei mir funktioniert, ohne dass der Servercode geändert werden muss... einfach einen Teelöffel Muskatnuss hinzufügen...

$(document).ready(function ()
{
    $(document).ajaxSend(
    function(event,request,settings)
    {
        var intercepted_success = settings.success;
        settings.success = function( a, b, c ) 
        {  
            if( request.responseText.indexOf( "<html>" ) > -1 )
                window.location = window.location;
            else
                intercepted_success( a, b, c );
        };
    });
});

Ich überprüfe das Vorhandensein des html-Tags, aber Sie können den indexOf so ändern, dass er nach jeder eindeutigen Zeichenfolge auf Ihrer Anmeldeseite sucht...

0 Stimmen

Dies scheint nicht für mich zu arbeiten, es hält auf den Aufruf der Funktion mit Ajax-Aufruf definiert, es ist wie es ist nicht überschreiben die Erfolgsmethode.

0 Stimmen

Zumindest bei mir scheint das nicht mehr zu funktionieren. Mögliche Erklärung hier: stackoverflow.com/a/12010724/260665

19voto

Dieses Problem kann auftreten, dann mit ASP.NET MVC RedirectToAction Methode. Um zu verhindern, dass die Antwort in div angezeigt wird, können Sie einfach eine Art von Ajax-Antwortfilter für eingehende Antworten mit $.ajaxSetup . Wenn die Antwort eine MVC-Umleitung enthält, können Sie diesen Ausdruck auf der JS-Seite auswerten. Beispielcode für JS unten:

$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data && typeof data == "string") {
            if (data.indexOf('window.location') > -1) {
                eval(data);
            }
        }
        return data;
    }
});

Wenn Daten sind: "fenster.standort = '/Konto/Anmeldung'" Der obige Filter fängt das auf und wertet es aus, um die Umleitung vorzunehmen, anstatt die Daten anzeigen zu lassen.

0 Stimmen

data im Antwortkörper oder in der Kopfzeile steht?

17voto

Graham King Punkte 5590

Ich fasse zusammen, was Vladimir Prudnikov und Thomas Hansen gesagt haben:

  • Ändern Sie Ihren serverseitigen Code, um zu erkennen, ob es sich um eine XHR handelt. Wenn ja, setzen Sie den Antwortcode der Weiterleitung auf 278. In django:
   if request.is_ajax():
      response.status_code = 278

Dadurch behandelt der Browser die Antwort als Erfolg und übergibt sie an Ihr Javascript.

  • Stellen Sie in Ihrem JS sicher, dass die Formularübermittlung über Ajax erfolgt, überprüfen Sie den Antwortcode und leiten Sie ihn bei Bedarf um:
$('#my-form').submit(function(event){ 

  event.preventDefault();   
  var options = {
    url: $(this).attr('action'),
    type: 'POST',
    complete: function(response, textStatus) {    
      if (response.status == 278) { 
        window.location = response.getResponseHeader('Location')
      }
      else { ... your code here ... } 
    },
    data: $(this).serialize(),   
  };   
  $.ajax(options); 
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X