Abgelaufene Session und AJAX Requests
Geschrieben von Dejan Spasic • Saturday, 5. July 2008 • Kategorie: Coding • Kommentare (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.【ツ】


0 Kommentare
Kommentar schreiben