No more Cookies Druckversion
ASP Sessions
ohne Sitzungscookies
Seite
[<] [1] (2) [3] [4] [>
Mo, 18.03.2002
Autor: Olaf Lüder

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

© 2001, 2002 NOGETEC GmbH - Alle Rechte vorbehalten. - Impressum
Der Inhalt dieser Seiten ist urheberrechtlich geschützt. Texte, Grafiken und Dateien dürfen ohne unsere schriftliche Genehmigung - auch auszugsweise - nicht kopiert, vervielfätigt oder vertrieben werden.
Übersicht
13 Beiträge
in 11 Kategorien

ASP classic (7)
ASP.NET (0)
Komponenten (2)
ISAPI-Filter (4)
Konfiguration (0)
No more Cookies
ASP Sessions
ohne Sitzungscookies

Sie nutzen das integrierte Session-Objekt?
Ihre Kunden akzeptieren aber keine Cookies?

Wir haben die Lösung...
Load me up
ASP Fileupload
ohne Komponenten

Sie möchten Dateien auf den Server heraufladen,
ohne Komponenten zu installieren?

Gar kein Problem...
Little Secrets
Dateinamen & Parameter
im URL verbergen

Verschiedene Pfade auf eine Datei abbilden...?
Skriptnamen weglassen, Parameter verstecken...?

So funktioniert's ...
Lost in Space
Recordsets
auf Abwegen

Sie nutzen Datenbanken & ADO-Recordsets...?
Die Performance ist aber nicht befriedigend...?

Dann lesen Sie weiter...
Subdomains
Subdomains einrichten
ohne viel Aufwand

Sie möchten Subdomains verwenden, mit eigenen Verzeichnissen aber ohne extra Host-Header oder Web-Sites einzurichten?

Wir zeigen Ihnen wie...