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:
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 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, D:\www\apps\search Das aktuelle Skript, 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 D:\www\apps\search\contrib Mit dieser Konfiguration verbleiben alle Anforderungen an den virtuellen Pfad der Kontributionsanwendung, 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 | |||||||||
|
|||||||||
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 | |
|
|
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 | |
|
|
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:
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 | |
|
|
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 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" %> 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:
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 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 |
|
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 |
|
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. |
|