Session-Objekt  

Eine der größten Herausforderungen, der Sie beim Erstellen einer funktionsreichen Webanwendung gegenüberstehen, ist die Verfolgung benutzerspezifischer Informationen während der Navigation eines Benutzers auf Ihrer Website, ohne diesen bei jeder Anforderung vom Server nach seiner Identität zu fragen. Zu den Informationen, die Sie aufzeichnen müssen, gehören die Benutzeridentifizierung, eine Sicherheitsgenehmigung (falls erforderlich) und - für umfangreichere Anwendungen - bevorzugte Benutzereinstellungen, die zulassen, dass Sie Ihre Website entsprechend der vom Benutzer gewählten Optionen gestalten. Das Hauptproblem bei der Verwaltung von benutzerspezifischen Informationen sind die Einschränkugnen des derzeitigen Standardprotokolls, HTTP 1.0.

HTTP 1.0 bietet zwar eine Funktion für durchgehend bestehende Verbindungen, über den Sie die Benutzeridentifikation und benutzerspezifische Daten verwalten können, der Nutzen dieser Funktion ist jedoch begrenzt. Hier eine kurze Eläuterung der Funktion ohne technische Details: Über das Hypertext Transfer Protocol 1.0 kann ein Client-Browser Keep-Alive-Meldungen an einen Proxyserver senden. Diese Meldungen beauftragen den Proxyserver, eine offene Verbindung zu dem anfordernden Client aufrecht zu erhalten. Diese Verbindungsanforderungen werden jedoch häufig vom Proxyserver nicht erkannt. Dieses Problem des Proxyservers führt zum Abbruch der Verbindung zwischen dem Proxyserver und dem angeforderten Webserver. Kurz gesagt ist die Aufrechterhaltung von Verbindungen zu Webserven unter HTTP 1.0 fehleranfällig und daher unzuverlässig. Dennoch wird dieses Protokoll bei weitem am häufigsten von Client-Browsern eingesetzt.

Die Lösung dieses Problems von Microsoft Internet Information Server (und anderen Webservern) ist die Verwendung von HTTP Persistent Client State - auch als Cookies bezeichnet - zur Identifizierung des Benutzers. IIS handhabt diesen Mechanismus über den Einsatz des integrierten Session-Objekts.

Das Session-Objekt repräsentiert die aktuelle Sitzung des Benutzers auf dem Webserver. Über die zugehörigen Eigenschaften und Methoden können Sie die informationen auf dem Server, die während einer Sitzung spezifisch für einen bestimmten Benutzer sind, über die Dauer der Verbindung mit diesem Benutzer bearbeiten. Die Zeitdauer der Verbindung ist als die Zeit definiert, ab der der Client seine erste Anforderung einer Seite innerhalb Ihrer Webanwendung stellt, bis 20 Minuten nach der letzten Anforderung des Benutzers an den Webserver. (Der Standardwert von 20 Minuten kann geändert werden, siehe Abschnitt "Timeout" weiter unten in diesem Kapitel.)

Eine Benutzersitzung kann auf eine von drei Arten initiiert werden:

    Ein Benutzer, der nicht bereits mit dem Server verbunden ist, fordert eine Active Server Page an, die zu einer Anwendung gehört, die eine Datei GLOBAL.ASA mit dem Code für das Ereignis Session_OnStart enthält.

    Ein Benutzer fordert eine Active Server Page an, deren Skript Informationen in einer Variablen mit sitzungsweiter Gültigkeit speichert.

    Ein Benutzer fordert eine Active Server Page in einer Anwendung an, deren Datei GLOBAL.ASA ein Objekt über das <OBJECT>-Tag instanziiert, wobei der Parameter SCOPE auf "Session" gesetzt ist.

Es ist zu beachten, dass eine Benutzersitzung für eine gegebene Anwendung auf Ihrer Website spezifisch ist. Tatsächlich ist es möglich, Sitzungsinformationen für mehrere Anwendungen gleichzeitig zu verwalten, wenn das Stammverzeichnis einer Anwendung ein virtuelles Verzeichnis ist, das sich in dem für eine andere Anwendung festgelegten virtuellen Verzeichnis befindet.

Der Webserver identifiziert jeden Benutzer über einen eindeutigen SessionID-Wert. Diese SessionID-Variable wird einem Benutzer zu Anfang seiner Sitzung auf dem Webserver zugewiesen und im Speicher des Webservers abgelegt. Die SessionID wird auf dem Client gespeichert, indem ein Cookie auf den Computer des Benutzers geschrieben wird, der die SessionID enthält. Dieser Cookie wird bei jeder Anforderung des Benutzers an den Server gesendet. Um den Benutzer zu identifizieren, ruft der Server den Cookie ab und vergleicht ihn mit einer SessionID im Speicher.

Zusätzlich zu der Variablen SessionID können Sie andere Informationen zu einzelnen Benutzern speichern. Sie können zudem jede beliebige Variable mit sitzungsweitem Gültigkeitsbereich an beliebiger Stelle in einem ASP-Skript initialisieren oder ändern. Um sicherzustellen, dass eine sitzungsbezogene Variable auf einen bestimmten Wert initialisiert wird, können Sie Code in die Ereignisprozedur Session_OnStart in der Datei GLOBAL.ASA schreiben. Diese Ereignisprozedur wird zu Beginn der Benutzersitzung ausgelöst. Die Datei GLOBAL.ASA (siehe Kapitel 11) ist eine spezielle Datei, die Sie entsprechend jeder ASP-Anwendung kodieren können. Der Code dieser Datei wird zu Beginn der Benutzersitzung verarbeitet.

Wie bereits erläutert, spielt das Session-Objekt eine äußerst wichtige Rolle bei der Verwaltung von Informationen zu einzelnen Benutzern. Sie können das Session-Objekt auch einsetzen, um einige der Probleme zu beheben, die spezifisch für nicht Englisch sprachige Clients sind, die Informationen von Ihrer Website anfordern.

Anmerkungen/Fehlerbehebung  
 
 

Eines der wichtigsten Dinge, an die Sie beim Einsatz des Session-Objekts denken müssen, ist sein Gültigkeitsbereich. Alle Informationen, die Sie mit sitzungsweiter Gültigkeit speichern, sind für die Dauer der Benutzersitzung in einer gegebenen Anwendung gültig. Dies ist ein wichtiger Punkt. Angenommen, Ihr Code umfasst eine sitzungsweite Variable, die im Zusammenhang mit der Suchanwendung auf Ihrer Website definiert wurde. Das virtuelle Verzeichnis dieser Anwendung, /search, reflektiert das folgende physische Verzeichnis:

D:\www\apps\search

Das aktuelle Skript, SearchStart.ASP, ist in diesem Verzeichnis gespeichert. Sie haben in diesem Skript beispielsweise die sitzungsweite Variable, strSearchPref, initialisiert. Der Benutzer ruft nun ein Anwendungsskript, ContribMain.ASP, auf, das sich in einer anderen Anwendung befindet, deren virtuelles Verzeichnis, /contrib, das folgende physische Verzeichnis reflektiert:

D:\www\apps\contrib

Wenn der Benutzer nicht innerhalb von 20 Minuten (bzw. den Wert der Sitzungsdauer) zu einem Skript in dem virtuellen Verzeichnis zurückkehrt, das die Suchanwendung umfasst, wird der Wert der sitzungweiten Variablen strSearchPref zurückgesetzt. Dies ist eine wichtige Fehlerquelle in komplexen Webanwendungen. Die sitzungsweit gültigen Variablen enden nach Ablauf der Sitzung, auch wenn der Benutzer in der Zeit, in der er die Anwendung nicht verwendet hat, mit anderen Anwendungen auf derselben Website gearbeitet hat.

Eine Möglichkeit, diese Problem zu vermeiden, ist die Verschachtelung von Anwendungen. Beispielsweise könnten Sie das virtuelle Verzeichnis /contrib wie folgt unterhalb des Suchverzeichnisses anordnen:

D:\www\apps\search\contrib

Mit dieser Konfiguration verbleiben alle Anforderungen an den virtuellen Pfad der Kontributionsanwendung, /contrib, im gleichen Zusammenhang wie die Suchanwendung.

Sie können die Standardzeitdauer ändern, nach der eine Benutzersitzung endet. Wozu ist das nützlich? Hierfür gibt es zwei mögliche Gründe: Erstens: Sie möchten die Sitzungsinformationen des Benutzers möglicherweise länger als 20 Minuten speichern. Vielleicht wissen Sie im Voraus, dass ein Benutzer Ihre Website für mehr als 20 Minuten verlassen und dann zurückkehren wird. Die zweite Möglichkeit ist, dass Sie die Informationen zur Benutzersitzung bereits früher beenden wollen. Sie wissen beispielsweise, dass die Benutzer nicht besonders lange auf Ihrer Website verweilen und möchten daher den Verbrauch von Serverspeicher minimieren, der durch Ablegen von Sitzungsinformationen benötigt wird. Im Abschnitt "Timeout" weiter unten in diesem Kapitel finden Sie Anweisungen dazu, wie diese Information auf einen anderen Wert gesetzt werden kann.

Die Speicherung dieser sitzungsweiten Informationen basiert auf dem Einsatz von Cookies, die an den Client und anschließend zurück an den Server gesendet werden. Was geschieht, wenn der Benutzer Cookies deaktiviert hat oder einen älteren Browser verwendet, der Cookies nicht unterstützt? Wenn Sie mit Windows NT oder Basic Authentication arbeiten, können Sie den Benutzer über das LOGON_USER-Element der Kollektion ServerVariables des Request-Objekts identifizieren. Mittels dieser Information können Sie benutzerspezifische Daten aus einer Datenbank oder aus Textdateien auf dem Server abrufen. Wenn Sie weder Windows NT noch Basic Authentication verwenden, können Sie den Benutzer wahrscheinlich nicht identifizieren. Früher konnten Sie die IP-Adresse eines Benutzers zur Identifikation verwenden. Aufgrund von dynamisch erzeugten IP-Adressen mit DHCP und Firewalls kann die IP-Adresse heute jedoch als für die Benutzeridentifikation nutzlos erklärt werden.

CodePage  
Session.CodePage (= intCodePageValue)
 

Gibt die Codepage an, die vom Webserver verwendet wird, um den dynamischen Inhalt im aktuellen Skript anzuzeigen, bzw. ruft sie auf. Eine Codepage ist ein Zeichensatz, der alle alphanumerischen Zeichen und Satzzeichen enthält, die von einer bestimmten Locale verwendet werden.

 
Parameter
intCodePageValue

Eine Ganzzahl ohne Vorzeichen, die einem bestimmten, auf dem Server installierten Zeichensatz entspricht. Wenn die Eigenschaft CodePage festgelegt ist, zeigt das System den Inhalt über diesen Zeichensatz an. In der folgenden Tabelle sind einige der möglichen gültigen Werte für diesen Parameter aufgeführt:

CodePage-Wert

Sprache

932

Japanisch Kanji

950

Chinesisch

1252

die meisten europäischen Sprachen (und Amerikanisches Englisch)

 
Beispiel
<%

' In the following code, assume that the original code 
' page setting is 1252 for American English. The 
' example demonstrates the use of the CodePage property 
' of the Session object to temporarily set the character
' set to Chinese so the text sent to the browser uses the
' Chinese character set:
Dim uintOrigCodePage
Dim uintChineseCodePage

uintChineseCodePage = 950
uintOrigCodePage = Session.CodePage

Session.CodePage = uintChineseCodePage
%>
' +-----------------------------------------------------------+
' | This text is sent to the client browser using the         |
' | Chinese character set.                                    |
' +-----------------------------------------------------------+
<%

' Remember to reset your CodePage property if you don't want 
' the rest of of the text created and placed into the HTML 
' stream to be displayed using the new character set.
Session.CodePage = uintOrigCodePage

%>
 
Hinweise

Standardmäßig verwendet ASP den Zeichensatz, den Sie mittels der Direktive CODEPAGE (siehe Kapitel 11) für die Skriptseite festgelegt haben. Die Festlegung der Eigenschaft CodePage überschreibt diese Einstellung nur für Text, der an den Browser gesendet wird. Skripttext wird weiterhin zwischen ASP und Ihrem Skript bzw. Ihrem Skript und ActiveX-Komponenten übertragen, wobei der Zeichensatz verwendet wird, der über die Direktive CODEPAGE festgelegt ist.

 
LCID  
Session.LCID (= intLCID)
 

Die Locale repräsentiert die bevorzugte Formatierung bestimmter Informationen eines Benutzers. Für einige Locales werden Datumsangaben beispielsweise im Format Monat/Tag/Jahr angegeben. Dies ist die Standard-Locale in den USA. Jede Locale lässt sich über ihre eigene LCID (auch Locale-ID) identifizieren. Dieser Code ist im Betriebssystem definiert.

Sie können die Locale-ID für den Inhalt Ihres Skripts über die Eigenschaft LCID des Session-Objekts festlegen. Die Eigenschaft LCID repräsentiert die gültige Locale-ID, die zur Anzeige des dynamischen Inhalts im Web-Browser verwendet wird.

 
Parameter
intLCID

Eine gültige Locale-ID mit 32 Bit.

 
Beispiel
<%

' The following code demonstrates the use of the LCID property 
' to temporarily set the locale identifier to Standard French.

Dim intOrigLCID
Dim intFrenchLCID

intFrenchLCID = 1036
intOrigLCID = Session.LCID

Session.LCID = intFrenchLCID
%>
' +-----------------------------------------------------------+
' | This text sent to the client browser will be formatted    |
' | according to the rules set by the locale identifier for   |
' | Standard French. For example, dates would be formatted    |
' | using the Day/Month/Year format, instead of the U.S.      |
' | standard Month/Day/Year.                                  |
' +-----------------------------------------------------------+
<%

' The next line resets the LCID property:
Session.LCID = intOrigLCID

%>
 
Hinweise

Die Syntax der Eigenschaft LCID entspricht der der Eigenschaft CodePage. Sie können hierüber die Formatierungsregeln für Uhrzeiten und Datumsangaben festlegen und zusätzlich Regeln für die Alphabetisierung von Strings aufstellen.

Wenn Sie die ASP-Direktive LCID verwenden, legen Sie die Locale-ID für die Skriptumgebung auf dem Server fest. Die Eigenschaft Session.LCID verwendet diesen Wert als Standard. Wenn Sie String- oder Datums-/Uhrzeitinformationen über unterschiedliche Regeln an den Client senden möchten, müssen Sie die Eigenschaft LCID des Session-Objekts festlegen. Dies hat jedoch keine Auswirkung darauf, wie die Strings und Datums-/Uhrzeitwerte intern im Skript formatiert werden.

 
SessionID  
Session.SessionID
 

Ein schreibgeschützter Wert, der ausschließlich die einzelnen aktuellen Benutzersitzungen identifiziert. Hierbei handelt es sich um einen Wert vom Datentyp Long, der als Cookie auf dem Client-Computer abgelegt ist. Während einer Benutzersitzung sendet der Browser des Benutzers diesen Cookie zur Identifizierung des Benutzers an den Webserver.

 
Parameter

Keine

 
Beispiel
<%

' The following code retrieves the current SessionID for
' a given user:

Dim lngUserSessionId

lngUserSessionId = Session.SessionID

%>
 
Hinweise

Die Eigenschaft SessionID wird erzeugt, wenn der Benutzer zum ersten Mal eine Seite von einem Webserver anfordert. Der Webserver erzeugt über einen komplexen Algorithmus einen Wert für die Eigenschaft SessionID und speichert diesen Wert dann in Form eines Cookies auf dem Computer des Benutzers. Bei jeder nachfolgenden Anforderung einer Seite des Webserver durch den Benutzer wird dieser Cookie in dem HTTP-Anforderungsheader an den Server gesendet. Der Server kann den Benutzer dann anhand seiner SessionID identifizieren. Der Cookie wird nur dann erneut initialisiert, wenn der Client den Browser oder der Webmaster den Webserver neu startet.

Es ist zu beachten, dass der SessionID-Cookie so lange auf dem Browser des Clients verbleibt und an den Webserver gesendet (und von diesem erkannt) wird, bis einer der beiden Computer (Client oder Webserver) neu gestartet wird. Diese Zeitdauer ist nicht gleichzusetzen mit der Eigenschaft Timeout des Session-Objekts. Angenommen, die Sitzung eines Benutzers endet oder wird über die Methode Abandon des Session-Objekts abgebrochen. Anschließend besucht der Benutzer die Website erneut, ohne jedoch seinen Browser neuzustarten. Vorausgesetzt, dass der Webserver seit dem Ende der letzten Sitzung ebenfalls nicht neu gestartet wurde, startet der Webserver nun eine neue Sitzung für den Benutzer, verwendet dafür jedoch die gleiche SessionID, die dann wiederum als Teil der HTTP-Anforderung an den Webserver gesendet wird.

Letzteres ist wichtig und sollte beachtet werden. Nur wenn sowohl der Client-Browser als auch die Webserveranwendungen nicht neu gestartet wurden, können Sie davon ausgehen, dass eine SessionID einen Benutzer eindeutig identifiziert. Verwenden Sie diesen Wert deshalb zum Beispiel nicht als Primärschlüssel, da er jedes Mal zurückgesetzt wird, wenn Browser oder Server angehalten und neu gestartet werden.

Bedenken Sie auch, dass ein Browser, der keine Cookies unterstützt oder auf dem Cookies deaktiviert sind, die SessionID nicht als Teil des HTTP-Anforderungsheaders sendet. In diesem Fall müssen Sie sich auf eine andere Methode zur Identifizierung von Benutzern verlassen. Über die EnableSessionStateVorverarbeitungsdirektive können Sie verhindern, dass die Webanwendung Cookies verwendet (weitere Informationen hierzu finden Sie in Kapitel 11).

Um Informationen ohne den Einsatz von Cookies beizubehalten, können Sie die Informationen jeder einzelnen Anforderung entweder an den Abfrage-String anhängen oder die identifizierenden Informationen von einem versteckten Formularelement auf Ihrer Seite senden.

 
Timeout  
Session.Timeout (=intMinutes)
 

Die Zeitdauer in Minuten, für die der Webserver die Informationen der Benutzersitzung beibehält, ohne eine Seite anzufordern bzw. zu aktualisieren. Dieser Wert ist standardmäßig auf 20 Minuten eingestellt.

 
Parameter
intMinutes

Die Anzahl Minuten, für die der Webserver die Sitzungsinformationen speichert.

 
Beispiel
<%

' The following code resets the Timeout property of the
' Session object from its default of 20 minutes to 5 
' minutes.

Session.Timeout = 5

%>
 
Hinweise

Die Eigenschaft Timeout ist einfach einzusetzen. Sie können den Wert dieser Eigenschaft beliebig hoch einstellen, er hat jedoch direkte Auswirkungen auf den Speicherverbrauch auf dem Webserver, der für jede Benutzersitzung erforderlich ist.

Sie sollten in Betracht ziehen, einen geringeren Wert für diese Eigenschaft zu wählen (siehe Beispiel), wenn Ihre Website im Allgemeinen nur kurz besucht wird. Wenn jedoch jede Seite für einen längeren Zeitraum besucht wird (beispielsweise bietet sie einen Taschenrechner, dessen Skript auf der Clientseite zu finden ist), sollten Sie diesen Wert möglicherweise erhöhen.

Im Gegensatz zu den meisten Eigenschaften des Session-Objekts wirkt sich diese Eigenschaft nicht nur auf die aktuelle, sondern auf alle Benutzersitzungen aus. Wenn Sie den Wert der Eigenschaft Timeout des Session-Objekts auf 120 Minuten setzen, verbleibt jede Information der Benutzersitzung bis 120 Minuten nach der letzten Anforderung oder letzten Aktualisierung der Seite im Speicher auf dem Webserver.

 
Contents-Kollektion  
Session.Contents.Item("Pi") = 3.14
 

Enthält alle Variablen und Objekte, die mit sitzungsweiter Gültigkeit über ein Skript hinzugefügt wurden (d. h. nicht mittels des <OBJECT> Tags).

Die Kollektion Contents des Session-Objekts weist wie andere ASP-Kollektionen die folgenden Eigenschaften auf:

Item

Ruft den Wert eines spezifischen Mitglieds der Kollektion Contents ab. Um welches Mitglied es sich handelt, bestimmen Sie mit Hilfe eines String-Schlüssels (dessen Wert über die Eigenschaft Key mit dem Index erhalten werden kann; mehr hierzu weiter unten) oder einer Indexzahl. Wenn Sie beispielsweise ein Element in der Kollektion Contents mit dem Wert "Pi" initialisieren möchten, können Sie eine Codezeile wie die folgende einsetzen:

Session.Contents.Item("Pi") = 3.14

In dieser Codezeile wird das gewünschte Element der Kollektion mit dem Schlüsselwert "Pi“ angegeben. Nach dieser Initialisierung können Sie mit folgender Codezeile den Wert des Elements aus der Kollektion Contents abrufen:

dblMyVar = Session.Contents.Item("Pi")

Aus Gründen, die gleich erklärt werden, lassen Sie uns nun annehmen, dass dies das erste Element ist, das der Kollektion Contents hinzugefügt wird.

Anstelle eines Schlüssels können Sie auch den Index eines Elements in der Contents-Kollektion verwenden, um dessen Wert abzurufen. Dies sehen Sie in der folgenden Codezeile:

dblMyVar = Session.Contents.Item(1)

Beachten Sie, dass das erste Element in der Contents-Kollektion nicht mit 0 (Null), sondern mit 1 (Eins) dargestellt wird. Dies ist deshalb von Bedeutung, weil eine Null in dieser Codezeile zur Initialisierung der Variablen db/MyVar mit einem unbestimmten Wert führen würde. Leider wird dies aber nicht als Fehler gemeldet. Das Ergebnis ist eine falsch initialisierte Variable:

dblMyVar = Session.Contents.Item(0) ' WRONG.

Item ist die Standardeigenschaft der Contents-Kollektion, und die Contents-Kollektion ist die Standardkollektion des Objekts Application. Das bedeutet, dass die folgenden drei Codezeilen in Ihrer Anwendung auf exakt dieselbe Weise interpretiert werden:

Session.Contents.Item("Pi") = 3.14
Session.Contents("Pi") = 3.14
Session("Pi") = 3.14

Folglich könnte man annehmen, dass auch die folgenden drei Codezeilen gleichwertig sind:

Session.Contents.Item(1) = 3.14159
Session.Contents(1) = 3.14159
Session(1) = 3.14159

Dies ist jedoch nur dann der Fall, wenn das erste Element in der Contents-Kollektion zuvor mit Hilfe eines Schlüssels definiert wurde. Aus der mit ASP gelieferten Dokumentation geht dies zwar nicht hervor, aber die ersten beiden Codezeilen können nur verwendet werden, wenn das Element zuvor mit einem Schlüssel definiert wurde. Gehen wir davon aus, Sie möchten der Contents-Kollektion ein zweites Element hinzufügen. Das Element kann mit keiner der folgenden Codezeilen initialisiert werden:

Session.Contents.Item(2) = 3.14159     ' WRONG.
Session.Contents(2) = 3.14159          ' WRONG.

Leider aber gibt es auch für diese Ausnahme eine Ausnahme. Sie können eine zweite Variable mit dieser Codezeile initialisieren:

Session(2) = 3.14159

Angesichts dieses uneinheitlichen Verhaltens wird schnell klar, dass es immer sicherer ist, auf den Wert eines spezifischen Elements in der Kollektion Contents mit einem Schlüssel anstatt mit einem Index zu verweisen.

Es ist auch wichtig, mit einem Schlüssel auf ein bestimmtes Mitglied der Contents-Kollektion zu verweisen, da sich der Index dieses Mitglieds ändern kann. Nehmen wir an, Ihre Anwendung enthält folgenden Code:

Session("strFirstName") = "Arthur"
Session("strMiddleName") = "Keyton"
Session("strLastName") = "Weissinger"

Sofern dies die ersten drei der Contents-Kollektion hinzugefügten Variablen sind, könnten Sie später mit Hilfe des jeweiligen Index auf sie verweisen:

strFirst = Session(1) 
strMiddle = Session(2)
strLast = Session(3)

Wenn Sie aber mit der Methode Remove, die eine Variable vollständig aus der Kollektion entfernt (siehe weiter unten in diesem Kapitel), die Variable strMiddleName entfernen, ändern sich die Indizes:

Session.Contents.Remove("strMiddleName")

strFirst = Session(1)       ' Initializes to "Arthur" 
strMiddle = Session(2)      ' Initializes to "Weissinger"
strLast = Session(3)        ' Initializes to Undefined.
Key

Stellt den Namen eines spezifischen Elements in der Contents-Kollektion dar. Wie bereits erwähnt, stellt die Eigenschaft Item den Wert jedes Elements dar. Ebenso stellt die Eigenschaft Key den Namen jedes Elements dar.

Wenn Sie den Namen eines bestimmten Schlüssels nicht kennen, rufen Sie ihn mit Hilfe seiner Ordnungszahl ab. Nehmen wir beispielsweise an, Sie möchten den Schlüsselnamen des dritten Elements in der Kollektion erfahren und anschließend dessen Wert abrufen. Hierfür könnten Sie folgenden Code verwenden:

strKeyName = Session.Contents.Key(3)
strKeyValue = Session.Contents.Item(strKeyName)
Count

Gibt die aktuelle Anzahl der Elemente in der Kollektion zurück.

Wie bei anderen ASP-Kollektionen können Sie den Wert eines beliebigen Felds der Kollektion Contents über die Eigenschaft Item abrufen. In den folgenden Beispielen wurde die Syntax jedoch verkürzt (wie auch an anderen Stellen in dieser Dokumentation), so dass die Verwendung der Eigenschaft Item nicht explizit zu sehen ist. Beispiel:

strSecurityCode = Session("UserSecurityCode")

ist eine verkürzte Form von:

strSecurityCode = Session.Contents.Item("UserSecurityCode")

Weitere Informationen zu den Kollektionseigenschaften Item, Key und Count finden Sie in Abschnitt 4.2 in Kapitel 4.

Bis ASP 3.0 verblieben in der Contents-Kollektion gespeicherte Elemente so lange im Speicher, bis die Benutzersitzung beendet war. In ASP 3.0 sind zwei Methoden hinzugefügt, die zulässt, Mitglieder aus der Kollektion zu entfernen.

Remove  
Session.Contents.Remove(Key | Index)
 

Entfernt ein bestimmtes Mitglied aus der Contents-Kollektion. Darüber hinaus können Sie mit der Methode Remove in IIS 5.0 spezifische Variablen der Kollektion Contents des Session-Objekts aus dem Speicher entfernen, ohne dazu auch alle anderen Variablen zu löschen.

Die Methode Remove stellt eine wichtige Ergänzung der Contents-Kollektion dar, da sie eine bessere Speicherverwaltung und -bereinigung ermöglicht. Mit Hilfe dieser Methode können Sie einige Elemente der Kollektion aus dem Speicher entfernen, ohne die Benutzersitzung aufgeben zu müssen. Wie zuvor unter der Beschreibung der Eigenschaft Item der Contents-Kollektion erklärt, ist es besonders wichtig, beim Aufruf der Methode Remove String-Schlüssel anstelle von Indizes zu verwenden. Der Index eines Elements kann sich im Laufe des Lebenszyklus einer Anwendung ändern. In diesem Fall liefert der Aufruf von Remove über einen gespeicherten Indexwert nicht absehbare Resultate.

 
Parameter
Key

Eine String-Variable, die den Namen des aus dem Speicher zu entfernenden Mitglieds der Contents-Kollektion angibt.

Index

Eine Ganzzahlvariable (Integer), die den Index des aus dem Speicher zu entfernenden Mitglieds der Contents-Kollektion angibt.

 
Beispiel

Mit dem folgenden Skript werden zwei Mitglieder der Contents-Kollektion entfernt:

<%
' This script assumes you have been "carrying around" various form
' variables for an online membership request form. The user has filled
' out the form, she has a username and is now a member. Now you would    
' like to remove her form data which you stored in Session variables 
' because it was convenient and the form's security had to be relatively
' high.
strFirstName = Session("strFirstName")
strLastName  = Session("strLastName")

.
.
.
Session.Contents.Remove("strFirstName")
Session.Contents.Remove("strLastName")
.
.
.
%>
 
RemoveAll  
Session.Contents.RemoveAll
 

Entfernt alle Mitglieder aus der Contents-Kollektion. Mit der in IIS 5.0 neu eingeführten Methode RemoveAll können Sie alle Variablen mit sitzungsweiter Gültigkeit aus dem Speicher entfernen, ohne die Sitzung selbst zu verlassen.

Wie Remove ist auch die Methode RemoveAll eine wichtige Ergänzung der Contents-Kollektion, da sie eine bessere Speicherverwaltung und -bereinigung ermöglicht. Mit ihr können Sie alle sitzungsweiten Variablen entfernen, ohne dazu die Sitzung selbst zu verlassen.

 
Parameter

Keine

 
Beispiele

Mit dem folgenden Skript werden alle Mitglieder der Contents-Kollektion entfernt:

<%
' This script assumes you have been "carrying around" various form 
' variables for an online membership request form. The user has 
' filled out the form, she has a username
' and is now a member. Now you would like to remove her form data which 
' you stored in Session variables because it was convenient and the
' form's security had to be relatively high.
' strFirstName = Session("strFirstName")
' strLastName  = Session("strLastName")

.
.
.
Session.Contents.RemoveAll
.
.
.
%>

Das folgendes Skript ist das erste von zwei ASP-Skripts, die der Benutzer besucht (das erste leitet den Browser des Benutzers zum zweiten um). In diesem ersten Skript werden die sitzungsweit gültigen Variablen für den Benutzer erstellt (SessionVar1, SessionVar2 und SessionVar3).

<HTML>
<HEAD><TITLE>Session Contents Example Page1</TITLE></HEAD>
<BODY>
<%
Dim strVar1
Dim strVar2
Dim strVar3

strVar1 = "Session Variable 1"
strVar2 = "Session Variable 2"
strVar3 = "Session Variable 3"

' Each of the next three varieties of syntax
' are equivalent.
Session.Content.Item("SessionVar1") = strVar1
Session.Content("SessionVar2") = strVar2
Session("SessionVar3") = strVar3

Response.Redirect SessionPage2.asp
%>
</BODY>
</HTML>

Anhand des zweiten Skripts werden die aktuellen Elemente in der Kollektion Contents des Session-Objekts näher betrachtet.

<HTML>
<HEAD><TITLE>Session Contents Example Page2</TITLE></HEAD>
<BODY>
<%
Dim intContentsCount
Dim strAppStatus
Dim strKey
Dim intCounter
Dim objMyComponent
Dim arystrNames( )


intContentsCount = Session.Contents.Count
strAppStatus = "Open"
%>
There are <%= intContentsCount %> items in the 
Session's Contents collection. <BR>
<%
For Each strKey in Session.Contents
%>
   The next item in Session's Contents collection<BR>
   has <%= strKey %> as its key and
   <%= Session.Contents(strKey) %>
   as its value.<BR>
<%
Next

' Set the AppStatus item in the Contents collection. 
' If this Session variable has been created before this,
' this line resets its value. If it has not been 
' created, this line creates it.
strAppStatus = "Page2...InProcess..."
Session("AppStatus") = strAppStatus

%>
The first three elements of the Session's Contents 
collection are as follows: <BR>
<%
' Retrieve the first three elements of the Contents 
' collection.
For intCounter = 1 to 3
%>
   <%= Session.Contents(intCounter) %> <BR>
<%
Next
%>
A second trip through the first three items.
<%
' This could just as accurately have been written 
' like this:
For intCounter = 1 to 3
%>
   <%= Session.Contents.Item(intCounter) %> <BR>
<%
Next

' Add an object to the Contents collection, then use that
' object's PrintDoc method through the Contents collection.
' (NOTE: For more on the Server object, see Chapter 9.)

'************************************************************
' If you try this script on your own, it will raise an error
' because of the lack of the Server component.
'************************************************************
Set objMyComponent = Server.CreateObject("MyComp.clsSpecial")
Session ("objRef") = objMyComponent 

' Call the object's method through the Contents collection.
Session ("objRef").PrintDoc
%>
</BODY>
</HTML>
 
Hinweise

Wenn Sie der Kollektion Contents des Session-Objekts eine Objektvariable hinzufügen, können Sie auf die Methoden und Eigenschaften dieses Objekts über die Contents-Syntax zugreifen. Durch den folgenden Code wird beispielsweise eine Instanz des Objekts MyServerComp erstellt und dann auf dessen Eigenschaft LastUpdated verwiesen.

Dim datLastUpdated
Set Session.Contents(objSessionMyObj)  =  _ 
   Server.CreateObject("MyCompanyDLL.MyServerComp")
datLastUpdated = Session.Contents(objSessionMyObj).LastUpdated

Beim Hinzufügen eines Arrays zur Kollektion Contents sollten Sie die gesamte Liste hinzufügen. Falls eines der Elemente in der Liste geändert werden muss, rufen Sie eine Kopie der Liste ab, ändern Sie das Element, und fügen Sie der Contents-Kollektion erneut die ganze Liste hinzu. Das folgende Beispiel verdeutlicht dies:

<% Response.Buffer = True%>
<HTML>
<HEAD><TITLE>Session Array Example</TITLE></HEAD>
<BODY>
<%
' Create an array variable and add it to the 
' Contents collection.
ReDim arystrNames(3)

arystrNames(0) = "Chris"
arystrNames(1) = "Julie"
arystrNames(2) = "Vlad"
arystrNames(3) = "Kelly"

Session.Contents("arystrUserNames") = arystrNames
%>
The second name in the User Names array is <BR>
<%= Session("arystrUserNames")(1) %>
<%

' Change an element of the array being held in the 
' Contents collection. Use a different (new) array 
' to temporarily hold the contents. Creating a new 
' array is the safest way to work with Session 
' arrays because most of the time you cannot be 
' guaranteed how many elements are contained 
' in a Session array created in another script.
arystrNames2 = Session("arystrUserNames")
arystrNames2(1) = "Mark"

Session("arystrUserNames") = arystrNames2
' The second name is now Mark.
%>
<BR><BR>Now, the second name in the User Names array is <BR>
<%= Session("arystrUserNames")(1) %><BR>
<BR><BR><BR><BR><BR>
NOTE: The first element of the Contents collection is still
1, not 0 -- even though the first element of the array in element 1 
("arystrUserNames") is 0:<BR><BR>
<%= Session.Contents(1)(0)%> <BR>
</BODY></HTML>

In der Datei GLOBAL.ASA erzeugte Objekte werden erst wirklich auf dem Server instantiiert, wenn zum ersten Mal eine Eigenschaft oder Methode dieses Objekts aufgerufen wird.

Falls Sie ein bestimmtes Objekt in einer Transaktion mit dem Objekt ObjectContext verwenden möchten, weisen Sie diesem Objekt weder einen anwendungs- noch einen sitzungsweiten Gültigkeitsbereich zu. In Transaktionen verwendete Objekte werden am Ende der Transaktion zerstört und nachfolgende Verweise auf ihre Eigenschaften oder Aufrufe ihrer Methoden erzeugen einen Fehler.

Sie werden feststellen, dass die Kollektion Contents (und StaticObjects) für das Session-Objekt der Kollektion Contents des Application-Objekts sehr ähnlich ist.

Die Kollektion Contents ist die Standardkollektion des Session-Objekts; sie weist jedoch ein ungewöhnliches Verhalten auf, das sie von der Kollektion Contents des Application-Objekts unterscheidet: Sie können ein Element nicht direkt aus dem Session-Objekt abrufen, da die impliziten Verweise auf die Kollektion Contents (die Standardkollektion des Session-Obejkts) und die Methode Item (der Standardwert der Kollektion) nicht erfolgreich aufgelöst werden.

Angenommen, Sie haben folgenden Code:

<HTML>
<HEAD><TITLE>Strange Behaviour</TITLE></HEAD>
<BODY>
<%
Session.Contents.Item("Item1") = "SessionVar1"
Session.Contents.Item("Item2") = "SessionVar2"
Session.Contents.Item("Item3") = "SessionVar3"
%>
. . . [additional code]

Da die Kollektion Contents die Standardkollektion des Session-Objekts ist, können Sie über folgende Codezeile auf Item2 verweisen:

strNewVar = Session("Item2")

Im Gegensatz zur Kollektion Contents des Application-Objekts können Sie jedoch nicht über die folgende Codezeile auf das gleiche Element verweisen. Diese Codezeile wird entweder ignoriert oder löst einen Fehler aus. Dies ist abhängig von der Variablen, die Sie abrufen möchten:

strNewVar = Session(2)

Folgender Code:

strNewVar = Session.Contents.Item(2)

oder:

strNewVar = Session.Contents(2)

führt jedoch nicht zu Fehlern.

Dieses Verhalten scheint an keiner Stelle dokumentiert zu sein, es tritt jedoch konsistent in IIS und Personal Web Server auf.

 
StaticObjects-Kollektion  
strFirstObjName = _
   Session.StaticObjects.Key(1)
 

Enthält alle Objekte mit sitzungsweiter Gültigkeit, die der Anwendung über das <OBJECT>-Tag hinzugefügt werden. Sie können die Kollektion StaticObjects einsetzen, um die Eigenschaften eines bestimmten Objekts in der Kollektion abzurufen. Darüber hinaus können Sie damit auch eine bestimmte Methode eines gegebenen Objekts in der Kollektion verwenden.

Die Kollektion StaticObjects des Session-Objekts weist wie andere ASP-Kollektionen die folgenden Eigenschaften auf:

Item

Repräsentiert den Wert eines bestimmten Elements in der Kollektion. Das gewünschte Element kann mit einem Index oder einem Schlüssel angegeben werden.

Key

Repräsentiert den Namen eines bestimmten Elements in der Kollektion. Beispiel:

strFirstObjName = _
   Session.StaticObjects.Key(1)

ruft den Namen des ersten Elements in der Kollektion StaticObjects des Session-Objekts ab.

Mit dem Wert der Eigenschaft Key rufen Sie den Wert eines Elements nach seinem Namen ab. Angenommen, der Name des ersten Elements ist objMyObject. In diesem Fall setzt der Code:

strKey = Session.StaticObjects.Key(1)
Session.StaticObjects.Item(strKey).Printer = "Epson 540"

den Wert der Eigenschaft Printer des Elements objMyObject in der Kollektion StaticObjects des Session-Objekts.

Count

Gibt die aktuelle Anzahl der Elemente in der Kollektion zurück.

Wie bei anderen ASP-Kollektionen können Sie den Wert eines beliebigen Felds der Kollektion StaticObjects über die Eigenschaft Item abrufen. In den folgenden Beispielen wurde die Syntax jedoch verkürzt (wie auch an anderen Stellen in dieser Dokumentation), so dass die Verwendung der Eigenschaft Item nicht explizit zu sehen ist. Beispiel:

strPrinterName = Session.StaticObjects("objMyObj").Printer

ist eine verkürzte Form von:

strPrinterName = Session.StaticObjects.Item("objMyObj").Printer

Weitere Informationen zu den Kollektionseigenschaften Item, Key und Count finden Sie in Abschnitt 4.2 in Kapitel 4.

Beispiel
' < FROM GLOBAL.ASA >
' This code resides in the GLOBAL.ASA file at the
' root of the current application. The following
' <OBJECT> tag is only processed once for the current
' application.
' See Chapter 11 for more details on the GLOBAL.ASA file.

<OBJECT RUNAT=Server 
SCOPE=Session
ID=AppInfo1 
PROGID="MSWC.MyInfo">
</OBJECT>

<OBJECT RUNAT=Server 
SCOPE=Session
ID=AppInfo2 
PROGID="MSWC.MyInfo">
</OBJECT>

' <>


<%
' The following code initializes the AppInfo1 component.
' This initialization code can reside anywhere.
AppInfo1.PersonalName = "Gertrude Stein"
AppInfo1.PersonalAddress = "233 Main Street"

AppInfo2.PersonalName = "David Davidson"
AppInfo2.PersonalAddress = "19A West Avenue"

' The following code uses the StaticObjects collection
' of the Session object to retrieve the value
' of the PersonalName property of both AppInfo1 and AppInfo2. 
For Each objInfo In Session.StaticObjects
%>
   The personal name is <BR>
   <%= Session.StaticObjects(objInfo).PersonalName%>
<%
Next
%>

There are <%= Session.StaticObjects.Count %> items
in the Session's StaticObjects collection.
 
Hinweise

Die Kollektion StaticObjects des Session-Objekts ermöglicht den Zugriff auf ein beliebiges mit einem <OBJECT>-Tag sitzungsweit instantiiertes Objekt. Auf Objekte, die mit der Methode Server. CreateObject instantiiert werden, kann über diese Kollektion nicht zugegriffen werden.

Aus dem Beispiel für StaticObjects in der Microsoft-Dokumentation zu IIS 5.0 geht hervor, dass Sie, wenn Sie diese Kollektion durchlaufen, auf die Eigenschaften jedes Objekts verweisen können. Dies ist ein wenig missverständlich, da man annehmen könnte, dass die Kollektion tatsächlich alle Eigenschaften des Objekts repräsentiert, anstatt die Objekte selbst. Wenn Sie auf die Eigenschaften oder Methoden von Objekten in der StaticObjects-Kollektion zugreifen möchten, verwenden Sie den Punkt-Operator außerhalb der Klammer um den Schlüssel, gefolgt von dem Namen der Eigenschaft oder Methode, wie hier dargestellt:

<%= Session.StaticObjects(objInfo).PersonalName%>

Diese Codezeile führt zum gewünschten Ergebnis, da Session.StaticObjects(objInfo) einen Verweis auf das Objekt objInfo zurückgibt.

In der Datei GLOBAL.ASA erzeugte Objekte werden erst wirklich auf dem Server instantiiert, wenn zum ersten Mal eine Eigenschaft oder Methode dieses Objekts aufgerufen wird. Deshalb können Sie erst dann mit der StaticObject-Kollektion auf die Eigenschaften und Methoden dieser Objekte zugreifen, wenn ein anderer Code in Ihrer Anwendung deren Instantiierung auf dem Server ausgelöst hat.

Falls Sie ein bestimmtes Objekt in einer Transaktion mit dem Objekt ObjectContext verwenden möchten, weisen Sie diesem Objekt weder einen anwendungs- noch einen sitzungsweiten Gültigkeitsbereich zu. In Transaktionen verwendete Objekte werden am Ende der Transaktion zerstört und nachfolgende Verweise auf ihre Eigenschaften oder Aufrufe ihrer Methoden erzeugen einen Fehler.

 
Abandon-Methode  
Session.Abandon
 

Gibt den Speicher frei, der vom Webserver benötigt wird, um Informationen zu einer bestimmten Benutzersitzung zu speichern. Dies hat jedoch keine Auswirkungen auf die Sitzungsinformationen anderer Benutzer. Wenn die Methode Abandon nicht explizit aufgerufen wird, speichert der Webserver alle Sitzungsinformationen, bis die Sitzung abgelaufen ist.

 
Parameter

Keine

 
Beispiel

Das folgende Skript ermöglicht dem Benutzer, auf einen Hyperlink zu klicken, der seinen Browser an eine Seite weiterleitet, die seine Sitzungsvariablen löscht:

<HTML>
<HEAD><TITLE>Session Abandon Example Page1</TITLE></HEAD>
<BODY>
Click <A HREF = "/SessionAbandonPage2.asp">here</A> to reset your user preferences.
</BODY>
</HTML>

Das folgende Skript löscht die Sitzungsvariablen:

<HTML>
<HEAD><TITLE>Session Abandon Example Page2</TITLE></HEAD>
<BODY>
<%

' The following code abandons the current user session.
' Note that the actual information stored for the current
' user session is not released by the server until the
' end of the current Active Server Pages.

Session.Abandon

%>
Your user preferences have now been reset.
</BODY>
</HTML>
 
Hinweise

Wenn Sie die Kollektion Contents des Session-Objekts häufig verwenden, ist die Methode Abandon eventuell sehr nützlich. Angenommen, Sie haben viele verschiedene Benutzervoreinstellungen als Sitzungsvariablen gespeichert, und Sie möchten diese jetzt - wie in dem Beispiel - alle löschen und zulassen, dass der Benutzer sich neue wählt. Ohne die Methode Abandon müssten Sie jede Variable manuell aus der Contents-Kollektion entfernen - ein langsamer und mühsamer Vorgang, wenn mehrere Variablen im Spiel sind. Anhand der Methode Abandon können Sie alle Variablen über nur eine Codezeile löschen.

Die Methode Abandon wird von dem Webserver verarbeitet, nachdem der Rest des aktuellen Skripts der Seite verarbeitet ist. Nach Abschluss der Verarbeitung der aktuellen Seite kann jedoch jede Seitenanforderung durch den Benutzer eine neue Sitzung auf dem Webserver initiieren.

In dem folgenden Beispiel ist die Sitzungsvariable intUserAge bis zum Ende der Seite für Ihr Skript verfügbar. Die Methode Abandon löscht die Variable erst nach dem Ende der Seite aus dem Speicher:

Session("intUserAge") = 23
Session.Abandon
[...More Code...]
' The current line successfully retrieves the value of 
' intUserAge.
intAgeCategory = CInt(Session("intUserAge") / 10)
[...End of Script. Session information is removed from web memory now...]

 
Session_OnEnd-Methode  
Session_OnEnd
 

Wird ausgelöst, wenn die Sitzung des Benutzers abgelaufen ist oder wenn Ihre Skripts die Methode Abandon des Session-Objekts aufrufen.

Falls die Ereignisprozedur OnEnd vorhanden ist, befindet sie sich in der Datei GLOBAL.ASA der Anwendung, die die angeforderte Seite enthält.

 
Parameter

Keine

 
Beispiel
<SCRIPT LANGUAGE = "VBScript" RUNAT = Server>

Sub Session_OnEnd

   ' If the user has a search results recordset open, close
   ' it:
   If IsObject(adoRSResults) Then
      Set adoRSResults = Nothing
   End If

End Sub

</SCRIPT>
 
Hinweise

Über den Code der Ereignisprozedur OnEnd haben Sie ausschließlich Zugriff auf die Objekte Application, Server und Session. Hierbei ist am wichtigsten, dass Sie keinen Zugriff auf die Objekte Response und Request haben und aus diesem Grund den Client nicht umleiten bzw. Cookies an den Client-Computer senden (oder Cookies vom Client-Computer erhalten) können.

Eine mögliche Verwendung des Ereignisses OnEnd ist das Schreiben von Informationen bezüglich des Benutzers in eine Protokoll- oder andere Textdatei auf dem Server für späteren Einsatz. Hierfür müssen Sie die folgenden wichtigen Punkte beachten: Bevor Sie überhaupt Informationen speichern können, müssen diese zuerst in einer Sitzungsvariablen gespeichert werden, da - wie bereits erwähnt - Sie keinen Zugriff auf das Request-Objekt haben, das die üblichste Quelle für Benutzerinformationen darstellt. Der folgende Code zeigt eine mögliche Methode zum Speichern einer sitzungsweiten Variablen:

<SCRIPT LANGUAGE = "VBScript" RUNAT = Server>

Sub Session_OnEnd
   
   ' Assume that SessionVar1 contains some user-preference 
   ' information.

   ' It is not important that you understand exactly what is
   ' happening in the following code (you can learn more about 
   ' File objects in Chapter 19). Just suffice it to say 
   ' that these lines of code write the value of the 
   ' SessionVar1 Session variable to the text file 
   ' UserPref.txt.
   Set fs = Server.CreateObject("Scripting.FileSystemObject")
   Set f = fs.GetFile("d:\UserPref.txt")
   Set ts = f.OpenAsTextStream(ForAppending,_
                    TristateUseDefault)
   ts.Write Session(SessionVar1)
   ts.Close

   ' Note that more often than not, if you want to save this
   ' information to the server at the end of a user's session, 
   ' it may very well be more efficient to store it to a 
   ' database than to a text file. However, the general
   ' principal (of storing Session variable information in
   ' the OnEnd event) is similar.

End Sub

</SCRIPT>

Es ist zu beachten, dass Sie die Methode AppendToLog des Response-Objekts nicht verwenden können, da kein Zugriff auf das Response-Objekt besteht. Darüber hinaus müssen Sie den physischen Pfad der Datei kennen, in die Sie schreiben möchten, wenn Sie direkt auf die Festplatte des Webserver schreiben. Dies ist darin begründet, dass Sie die MapPath-Methode in dem Ereignis OnEnd nicht verwenden können, obwohl Zugriff auf das Server-Objekt besteht. (Weitere Informationen zu der MapPath-Methode finden Sie unter "MapPath" in Kapitel 9).

 
Session_OnStart-Methode  
Session_OnStart
 

Wird jedes Mal ausgelöst, wenn ein Benutzer, der nicht bereits eine Sitzung auf dem Webserver instanziiert hat, eine Seite von dem Server anfordert. Falls der Code in dem Ereignis OnStart des Session-Objekts vorhanden ist, wird er vor dem Code auf der angeforderten Seite verarbeitet.

Falls die Ereignisprozedur OnStart vorhanden ist, befindet sie sich in der Datei GLOBAL.ASA der Anwendung, die die angeforderte Seite enthält.

 
Parameter

Keine

 
Beispiel
<SCRIPT LANGUAGE = "VBScript" RUNAT = Server>

Sub Session_OnStart

   Dim strSiteStartPage
   Dim strCurrentPage
   Dim timUserStartTime
   Dim strUserIPAddress
   Dim strUserLogon

   ' Use the OnStart event to initialize session-level
   ' variables that your scripts can use throughout the
   ' the duration of the user's session.
   Session("timUserStartTime") = Now( )
   Session("strUserIPAddress") = _
           Request.ServerVariables("REMOTE_ADDR")

   ' Use the OnStart event to redirect the client if
   ' she attempts to enter the site from somewhere
   ' other than the site's home page.
   strCurrentPage = Request.ServerVariables("SCRIPT_NAME")
   strSiteStartPage = "/apps/home/startpage.asp"

   If StrComp(strCurrentPage, strSiteStartPage, 1) Then
      Response.Redirect(strSiteStartPage)
   End If

   ' You can also use the OnStart event of the Session
   ' object to assess user security access from the very
   ' beginning of the user's session. Note this code requires
   ' use of either the Basic authentication or Windows 
   ' NT Challenge Response access control on the web server.
   strUserLogon = Request.ServerVariables("LOGON_USER")
   [...Code to Determine Security Level...]

End Sub

</SCRIPT>
 
Hinweise

Wenn der Client-Browser keine Cookies unterstützt oder der Benutzer Cookies deaktiviert hat, wird das Ereignis Session_OnStart jedes Mal verarbeitet, wenn der Benutzer eine Seite von der Website anfordert. Es wird also keine Sitzung gestartet oder verwaltet.

Wie für das Ereignis OnEnd ist eine mögliche Verwendung des Ereignisses OnStart das Schreiben von Informationen bezüglich des Benutzers in eine Protokoll- oder andere Textdatei auf dem Server für späteren Einsatz. Hierbei ist jedoch zu beachten, dass Sie die Methode AppendToLog des Response-Objekts nicht einsetzen können. Darüber hinaus müssen Sie den physischen Pfad der Datei kennen, in die Sie schreiben möchten, wenn Sie direkt auf die Festplatte des Webserver schreiben. Dies ist darin begründet, dass Sie zwar - wie bei dem Ereignis OnEnd des Session-Objekts - Zugriff auf das Server-Objekt haben, jedoch nicht die MapPath-Method des Server-Objekts in dem Ereignis Session_OnStart verwenden können.