Wie können Session Timeouts in Ajax-Anfragen am besten behandelt werden?

9

Betrachten Sie diese Django-Ansicht, die eine Liste von Elementen erhält, die dem aktuellen Benutzer zugeordnet sind:

%Vor%

Offensichtlich möchte es den login_required Decorator verwenden, um den Zugriff auf die Ansicht für angemeldete Benutzer zu beschränken.

Was macht login_required , wenn ein nicht authentifizierter Benutzer versucht, auf die Ansicht zuzugreifen? Sie gibt HttpResponseRedirect in Richtung settings.LOGIN_URL zurück.

Betrachten Sie diesen JavaScript-Code, der die Ansicht aufruft:

%Vor%

Angenommen settings.SESSION_COOKIE_AGE = 60 Sekunden.

Wenn ein Benutzer auf Seite 1 geht, liest er 61 Sekunden lang und klickt dann auf die Schaltfläche für Seite 2, Djangos login_required Dekorator erkennt, dass die Sitzung nicht mehr aktiv ist und gibt HttpResponseRedirect(settings.LOGIN_URL) zurück, wodurch der success -Rückruf eine HTML-Anmeldung erhält Seite anstelle der JSON-codierten Liste.

Hier passiert es.
Es wird von user_passes_test hier aufgerufen.

Was ist der beste Weg, damit umzugehen?

Hier ein paar Dinge, an die ich gedacht habe:

1. Der success Callback sollte die Antwort prüfen und prüfen, ob er eine Login-Seite erhält, mit welchen Mitteln auch immer (prüfen Sie, ob der Inhaltstyp HTML ist, überprüfen Sie den Inhalt usw.). Aber das bedeutet, dass wir alle AJAX-Aufrufe mit einem Callback-Wrapper wie folgt umhüllen müssen:

%Vor%

Aber das ist hässlich, und Entwickler könnten das überall vergessen.

2. Verwenden Sie $.ajaxComplete , um alle Anfragen zu bearbeiten.

%Vor%

Aber das ist die Rufreihenfolge:

%Vor%

Wir fangen also nur die Weiterleitung, nachdem successCallback fehlgeschlagen ist, und möglicherweise mit JS-Fehlern aufgrund der ungültigen Daten, die es erhalten hat.

3. Wenn login_required zurückgeben würde 403 auf AJAX-Anfragen:

%Vor%

Aber login_required verwendet nur user_passes_test was dies nicht tut.

user_passes_test hat eine Menge Funktionen in da ist es nicht so eine gute Idee, es neu zu implementieren.

Wie lassen sich die Timeouts für AJAX-Anrufe am besten umgehen?

    
Prody 14.03.2012, 01:24
quelle

2 Antworten

5

Ich würde damit umgehen, indem ich die Session-Timeout-Methode überprüfe, ob sie mit AJAX angefordert wird oder nicht. Wenn es Ajax ist, geben Sie einen Statuscode 401 nicht autorisiert (oder 403 verboten oder welcher Status auch immer sinnvoll) mit einer leeren JSON-Zeichenfolge zurück. Als nächstes binden Sie in Ihrem Javascript einen globalen ajaxError -Handler ein, der nach diesem Statuscode sucht und diesen entsprechend behandelt.

    
Kevin B 14.03.2012, 01:50
quelle
0

Sie können etwas wie Ссылка verwenden, mit dem Sie einen schönen Wrapper für Ihre AJAX-Aufrufe schreiben und dann sein Datenzuordnung , um zu überprüfen, ob der Benutzer noch angemeldet ist, bevor er den AJAX-Anruf ausführt.

Auf diese Weise können Sie einen clientseitigen Timer verwenden, der den Benutzer auf den abgemeldeten Status setzt und einen Hinweis bereitstellt, damit die Anmeldungsprüfung nicht vor jedem AJAX-Aufruf durchgeführt werden muss.

Alternativ können Sie einen benutzerdefinierten Decoder verwenden, der den Benutzer auffordert, sich anzumelden und den AJAX-Anruf erneut zu versuchen, wenn der Benutzer dies tut wurde ausgeloggt. Es müsste alle xhr Daten und Callbacks, mit denen es aufgerufen wird, speichern, bis sich der Benutzer anmeldet.

    
w00t 22.03.2012 16:22
quelle

Tags und Links