| Die Idee
Beim Start einer neuen Sitzung übergibt der Server ein Cookie mit der SessionID an den Browser. Wir versuchen, dieses Cookie abzufangen und die SessionID als Teil des URL zu übergeben. Eine Übergabe als Parameter scheidet aus, da in diesem Fall (wie beim Cookie Munger) die komplette Serverantwort - auf Kosten der Performance -durchsucht und bearbeitet werden muss.
Wir haben uns dazu entschlossen, die SitzungsID als Teil des URL-Pfades zu übergeben, quasi als virtuelles Verzeichnis. Hierbei gibt es zwar auch einige - im weiteren noch genauer beschriebene - Besonderheiten zu beachten, insgesamt stellt dies aber insgesamt den unserer Meinung nach besten Kompromiss dar.
Angenommen Sie möchten die Seite http://www.nogetec.de/sessionid/seite2.asp abrufen, die Anforderung des Browser könnte wie folgt aussehen:
GET /sessionid/seite2.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: de
Connection: Keep-Alive
Host: www.nogetec.de
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Accept-Encoding: gzip, deflate
Bei jeder Anfrage wird der komplette Pfad der gewünschten Datei an den Server übergeben, wenn wir hier die SessionID 'verstecken', wird uns diese also auch bei jeder Anfrage übermittelt. Wir können sie in einem Filter aus dem URL extrahieren und daraus das vom Server benötigte Session-Cookie generieren, der folgende URL wäre daher mit dem obigen Beispiel identisch:
http://www.nogetec.de/ASPSESSIONIDGQGGGNBGLPPPHIMBDECFMCLIFPLPOJNP/sessionid/seite2.asp
Wir befinden uns also in einem virtuellen Verzeichnis 'ASPSESSIONID...'; virtuell deshalb, weil dieses auf dem Server natürlich nicht existiert. Wenn wir uns einmal in diesem Verzeichnis befinden, wird die SessionID bei allen künftigen Anfragen mit übertragen - zu beachten ist nur, dass wir dieses Verzeichnis nie verlassen. Indem wir ausschließlich relative Pfadangaben in allen Links verwenden, läßt sich dies leicht sicherstellen.
Ein Problem ist allerdings noch zu lösen - wie gelangen wir überhaupt in dieses virtuelle Verzeichnis?
Hierzu ist eine einmalige Umleitung, also ein Redirect, notwendig. Die beste Lösung besteht darin, wenn Sie diese Umleitung selbst zu Beginn der Sitzung durchführen. Am einfachsten läßt sich dies durch einen Aufruf von Response.Redirect in der Session_OnStart-Methode erreichen.
Alternativ kann der Filter auch selbst ein Redirect veranlassen, sobald er vom Server ein Sitzungscookie erhält - hierbei wird die Seite, die die Sitzung gestartet hat, allerdings ein zweites Mal aufgerufen. Sie sollten auf diese Variante daher nur dann zurückgreifen, wenn Sie bestehende Anwendungen haben, die Sie nicht wie oben beschrieben anpassen können oder möchten.
Die empfohlene Methode läßt sich z.B. durch folgende einfache Session_OnStart-Methode in der Datei 'global.asa' realisieren:
function Session_OnStart(){
Response.Redirect('/SessionID/Seite1.asp');
}
Lassen Sie uns noch einmal im einzelnen nachvollziehen, was hierbei passiert - aus Gründen der Übersichtlichkeit betrachten wir nur die für uns wichtigen Header:
Die Seite http://www.nogetec.de/sessionid/seite2.asp wird abgerufen, folgende Anforderung sendet der Browser:
GET /sessionid/seite2.asp HTTP/1.1
Host: www.nogetec.de
Da im URL keine SessionID enthalten ist, leitet unser Filter die Anfrage unverändert an den Server weiter. Da es sich um die erste Anfrage handelt, wird eine neue Sitzung gestartet und die Session_OnStart-Methode abgearbeitet. Aufgrund der dort enthaltenen Redirect-Anweisung (s.o.) wird folgende Antwort vom Server an den Browser geschickt:
HTTP/1.1 302 Object moved
Location: /SessionID/Seite1.asp
Set-Cookie: ASPSESSIONIDQQQGQXRQ=IHPNBGKBGHOEHBPFGDFIAOGG; path=/
Diese Antwort wird von unserem Filter abgefangen und wie folgt bearbeitet. Der Inhalt des Session-Cookies wird als Pfadangabe vor das eigentliche Redirect-Ziel geschrieben, anschließend wird das Cookie entfernt; wir erhalten folgende Antwort, die an den Client weitergeleitet wird:
HTTP/1.1 302 Object moved
Location: /ASPSESSIONIDQQQGQXRQIHPNBGKBGHOEHBPFGDFIAOGG/SessionID/Seite1.asp
Der Browser startet daraufhin eine neue Anfrage mit dem erhaltenen Ziel, dies entspricht folgender Anforderung:
GET /ASPSESSIONIDQQQGQXRQIHPNBGKBGHOEHBPFGDFIAOGG/SessionID/Seite1.asp HTTP/1.1
Host: www.nogetec.de
Der Filter fängt diese Anfrage ab, extrahiert die SessionID aus dem URL und generiert daraus das benötigte Cookie:
GET /SessionID/Seite1.asp HTTP/1.1
Host: www.nogetec.de
Cookie: ASPSESSIONIDQQQGQXRQ=IHPNBGKBGHOEHBPFGDFIAOGG
Wird der Filter für die automatische Cookie-Erkennung ('EnableBrowserCheck') konfiguriert, gibt es ein paar kleine Unterschiede. Auch in diesem Fall wird die Antwort vom Filter abgefangen und der Inhalt des Session-Cookies als Pfadangabe vor das eigentliche Redirect-Ziel gestellt, allerdings wird das Cookie nicht entfernt, sondern zusätzlich zum Browser geschickt:
HTTP/1.1 302 Object moved
Location: /ASPSESSIONIDQQQGQXRQIHPNBGKBGHOEHBPFGDFIAOGG/SessionID/Seite1.asp
Set-Cookie: ASPSESSIONIDQQQGQXRQ=IHPNBGKBGHOEHBPFGDFIAOGG; path=/
Der Browser startet daraufhin eine neue Anfrage mit dem erhaltenen Ziel. Wenn er das Cookie nicht akzeptiert hat, enthält diese Anfrage kein Sitzungscookie und der weitere Ablauf erfolgt wie oben beschrieben; wenn der Client das Sitzungscookie angenommen hat, erhalten wir folgende Anforderung:
GET /ASPSESSIONIDQQQGQXRQIHPNBGKBGHOEHBPFGDFIAOGG/SessionID/Seite1.asp HTTP/1.1
Host: www.nogetec.de
Cookie: ASPSESSIONIDQQQGQXRQ=IHPNBGKBGHOEHBPFGDFIAOGG
In diesem Fall ist die Angabe der Session-ID im URL-Pfad unnötig, so dass wir noch einmal ein Redirect zur gleichen Seite, allerdings mit enfernter Sitzungskennung, veranlassen:
HTTP/1.1 302 Object moved
Location: /SessionID/Seite1.asp
Wir erhalten daraufhin vom Browser die endgültige Anfrage, die wir ohne weitere Modifikation an den Server durchreichen können::
GET /SessionID/Seite1.asp HTTP/1.1
Host: www.nogetec.de
Cookie: ASPSESSIONIDQQQGQXRQ=IHPNBGKBGHOEHBPFGDFIAOGG
|