Abgelaufene Session und AJAX Requests

Geschrieben von Dejan Spasic • Saturday, 5. July 2008 • Kategorie: CodingKommentare (0)

Ich habe mich vor kurzem mit dojo beschäftigt und bin dabei auf ein allgemeines Problem gestoßen. Was passiert, wenn, in eine nur für registrierte Benutzer zugängliche Seite, ein XHR gestartet wird, jedoch die Sitzung inzwischen abgelaufen ist? Falls dieser Fall nicht behandelt wird, erhält der Benutzer im schlimmsten Fall eine für ihn nichts sagende Fehlermeldung. Wie geht man hier am besten vor?


Ob der Weg den ich eingeschlagen habe, die beste Lösung ist, sei mal dahingestellt. Meine Überlegung ging dahin, dass serverseitig die Applikation den Typ des Requests unterscheiden muss. Es muss unterscheiden ob es sich um einen XHR oder um einen "normalen" Request handelt und entsprechend reagieren. In meinem Fall, gibt die Applikation bei einem "normalen" Request die Loginseite und bei einer XHR wird die Antwort in JSON mit einer definierten Struktur zurückgegeben. Die JSON könnte z.B. wie folgt ausehen.

{success: false, errorcode: 403}

Auf der Clientseite könnte man jetzt bei jeden XHR einen callback vor den eigentlichen callback einfügen um den Response der Webapplikation zu überprüfen. Da ich aber nicht ein Fan von Wiederholungen bin, kommt sowas bei mir nicht in Frage. Zudem könnte ich bei diesen Verfahren, dojo.data so nicht verwenden. Ich müsste hirzu ein Wrapper erstellen.

Die Lösung ist relative einfach und heißt AOP. Dank JavaScript ist dieses Paradigma sehr leicht anzuwenden. Und dank ajaxpect ist das Ganze noch leichter umzusetzen. Jetzt brauche ich nur einen Methode, die bevor der XHR ausgeführt wird, die Callbacks mit unseren austauscht und bei erfogreichem Response der Applikation den eigentlichen Callback ausführt. Andernfalls wird z.B. ein Logindialog ausgegeben.

if(!dojo._hasResource["tm.aop.dojoXhr"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo._hasResource["tm.aop.dojoXhr"] = true;
dojo.provide("tm.aop.dojoXhr");

dojo.declare("tm.aop.dojoXhr", null, {
  constructor: function() {
  },
  beforeXhr: function(args) {
    var ioArgs = args[1]; //Hole das zweite Argument
    var loadCallback = ioArgs.load; //Speicher den load callback
    var errorCallback = ioArgs.error; //Speicher den error callback

    //Ueberschreibe den error callback
    ioArgs.error = function(response, ioArgs) {
      //Hier wird die Antwort der Applikation behandelt
      //..

      //Es ist alles in Butter wir fuehren jetzt den eigentlichen callback aus
      if (errorCallback && "function" === typeof(errorCallback)) {
        response = errorCallback(response, ioArgs);
      }
      return response;
    };

    //Ueberschreibe den load callback
    ioArgs.load = function(response, ioArgs) {
      //Hier wird die Antwort der Applikation behandelt
      //..

      //Es ist alles in Butter wir fuehren jetzt den eigentlichen callback aus
      if (loadCallback && "function" === typeof(loadCallback)) {
        response = loadCallback(response, ioArgs);
      }
      return response;
    };

    args[1] = ioArgs;
    return args;
  }
});

}

Das Ganze wird dann wie folgt eingesetzt.

var tmAopDojoXhr = new tm.aop.dojoXhr();
Ajaxpect.addBefore(dojo, "xhr", tmAopDojoXhr.beforeXhr);

Das war es schon wieder für Heute.【ツ】

Tags für diesen Artikel: , , , ,

0 Trackbacks

  1. Keine Trackbacks

0 Kommentare

Ansicht der Kommentare: (Linear | Verschachtelt)
  1. Noch keine Kommentare

Kommentar schreiben


Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA

Sie können [geshi lang=LANG][/lang] Tags verwenden um Quellcode abhängig von der gewählten Programmiersprache einzubinden


Kommentare werden erst nach redaktioneller Prüfung freigeschaltet!