Eigene History
Geschrieben von: Rainer Völschow Wenn man beim Browser eine Seite besucht hat und mit Javascript () oder dem Back-Button eine oder mehrere Seiten zurückspringt, so kann man mittels des Forward-Buttons zu dieser Seite zurückkehren. Dies ermöglicht so einem User, Daten zweimal einzugeben. Wie man dies verhindert, soll dieser Artikel zeigen. Weil die Historyliste des Browsers nur in geringem Maße (über client-side JavaScript oder VBScript) manipuliert werden kann, muß eine andere Lösung gefunden werden. Anlegen einer ListeEine Lösung des Problems bestände darin, eine eigene History für jeden User am Webserver mittels ASP anzulegen. Kern dieses Unterfangens ist die Servervariable SCRIPT_NAME. Sie enthält den Namen (inklusive Pfad) der aktuellen ASP Seite. Man kann also mittels der ServerVariable SCRIPT_NAME den Namen des augenblicklich abgearbeiteten ASP Skripts inklusive dem virtuellen Pfad (z.b. /support/anfrage.asp) auslesen, diesen mit den besuchten Seiten in der Historyliste vergleichen, und danach die besuchte Seite zur Historyliste hinzufügen. Speichern der Liste in einer Session VariableÄhnlich wie das client-side Vorbild - das History Objekt im Browser - soll auch die von uns benutzte Liste skriptübergreifend verfügbar sein. Allerdings soll die Liste gelöscht werden, wenn die aktuelle Webapplikation nicht mehr verwendet wird. Diese Eigenschaft erfüllen vorrangig ASP Sessionvariablen. Wie man nun die augenblickliche Seite abfragt und die in einer Sessionvariable gespeicherte Historyliste verwaltet, zeigt das folgende ASP Skript: <% curSite = Request.Servervariables("Script_Name") ablage = Session("history") If InStr(ablage,curSite) > 0 Then Response.Write("Diese Seite wurde schon besucht." & _ "<a href=javascript:history.go(-1)>Zurück</a>") Else Session("history") = Session("history") & _ curSite & " | " End if %> Zunächst wird im ersten Schritt der Name (inklusive virtuellem Pfad) des aktuellen Skriptes ermittelt und in der Variablen curSite abgelegt. Der Inhalt der Sessionvariable History wird in der Variablen ablage zwischengespeichert. Im Anschluß daran wird mit Hilfe der Funktion InStr (= in String enthalten) überprüft, ob der zuvor ermitteltet Name der augenblicklichen ASP Seite, der jetzt als String zur Verfügung steht, sich bereits in der Variable ablage befindet oder nicht. Der Rückgabewert der Funktion InStr ist für diese Überprüfung entweder 0 für den Fall, daß die Seite noch nicht besucht wurde, oder größer als 0, wenn die Seite bereits in der Variablen ablage gespeichert ist. Die Null als Ergebnis der InStr Funktion bedeutet, daß die Zeichenkette cursite nicht in der Zeichenkette ablage vorhanden ist. Ein Wert von größer als Null gibt die Position der Zeichenkette ablage in curSite an. Wird nun dieser String in der Sessionvariable nicht gefunden, so wird der Inhalt der Sessionvariable um den Variableninhalt von curSite erweitert. Das Zeichen " | " dient als Trennzeichen und kann eigentlich durch jedes beliebige andere Zeichen ersetzt werden. Es wird aber nicht empfohlen, den Punkt oder den Schrägstrich (Slash) zu verwenden, weil selbiger bereits im Namen der ASP Datei verwendet wird. Da dieser Skriptteil in jeder geschützen Seite gleich aussieht und unverändert verwendet werden kann, ist das Includen des Scripts, mittels #include Directive, in alle zu schützenden ASP Seiten empfehlenswert. Auch das Zählen der Einträge ist in unserer Historyliste möglich. Nun gibt es in VBScript keine vordefinierte Zeichenkettenfunktion, mit der man einfach die Anzahl eines beliebigen Zeichens ermitteln kann (vom RegExp Objekt in VBScript 5 kann man nicht sagen, daß es einfach zu benutzen ist). Im Gegensatz dazu gibt es bei den Arrays eine Zählfunktion, mit der man die Anzahl der Elemente ermitteln kann. Bevor man diese Funktion benutzen kann, muß zunächst ein Aufsplitten des Strings in ein Array erfolgen. Da der Inhalt der Sessionvariable weiterhin benötigt wird, darf dieser nicht verändert werden.
<% ablage = Split(Session("history"),"|") anzahl = UBound(ablage,1) %> Das Aufsplitten der Zeichenkette in ein Array kann, wie hier gezeigt, mit der Funktion Split(Variable, Trennzeichen) erfolgen. Jeder Teilstring zwischen dem zuvor definierte Trennzeichen wird in ein eigenes Arrayelelement geschrieben. Nach Umwandlung der Zeichenkette in ein Array kann man mit der Funktion UBound(Arrayname, Dimension) die Abmessungen eines Arrays ermitteln. Der Parameter 1 gibt nur an, daß die Anzahl der Elemente in der ersten Dimension des Array ermittelt werden soll. Das Löschen von Einträgen in der History Session Variable erfolgt mit Replace, wobei zu beachten ist, daß auch das Trennzeichen gelöscht wird. So verhindert man ein Verfälschung der Anzahl von Listeneinträgen. Der Historyinhalt kann durch Verwendung von Response.Write() zum Browser geschrieben werden. Mit Verlassen der Webapplikation (Schließen der Browserfenster oder Inaktivität auf der Website für eine gewisse Zeitspanne) durch den User wird die aktuelle Session beendet, wodurch auch die Sessionvariable History ihre Gültigkeit verliert und vom Server automatisch verworfen wird. Möglichkeit des Speicherns der History in der ApplicationDer Nachteil bei der Verwendung von Session Variablen ist, daß der Browser einen Session Cookies speichern muß, damit der Webserver den Aufruf einer ASP Seite einer bestimmten Session zuordnen kann. Akzeptiert der Browser keine Cookies, so beginnt für den Benutzer mit dem Aufruf einer neuen ASP Seite eine neue Session. VBScript bietet als Alternative zu Sessionvariablen die Applicationvariablen an, die an keine Cookies gebunden sind. Im Gegensatz zu den Sessionvariablen werden sie nicht der aktuellen SessionID zugeordnet, so daß der Inhalt einer Applicationvariablen für ASP Skripts aller Benutzer zu Verfügung steht. Aufgrund dieser Eigenschaft ist für das Anlegen einer eigenen Historyliste ein wenig mehr Programmieraufwand nötig, um für jeden Benutzer eine eigene Historyliste zu erstellen. Dies kann durch die Definition eines Variablenames erreicht werden, der für jeden Benutzer eindeutig sein muß. Außerdem muß darauf geachtet werden, daß nicht mehr benötigte Application Variablen gelöscht werden, da ansonsten der Speicher des Webservers unnötig belastet und zugemüllt wird, was sich in einer drastischen Performanceeinbuße bemerkbar macht. SchlußbemerkungDie hier vorgestellte Möglichkeit kann innerhalb einer User-Session (Sitzung) verhindern, daß der Besucher Daten in eine Datenbank doppelt einträgt. Allerdings könnte man eine bereits besuchte Seite immer noch mit den 'Vorwärts' oder 'Zurück'-Buttons des Browsers erreichen. Will man auch dies verhindern so wendet man einen weiteren Kunstgriff an, indem man in jedem ASP Skript am Anfang das Ablaufdatum für eine ASP Seite auf "Sofort" setzt:
Response.Expires=0 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-control", "no-store" Dies veranlasst die meisten Browser, die Seite nicht mehr anzuzeigen wenn man mit den 'Vorwärts' oder 'Zurück'-Buttons arbeitet. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Caching bei Browser und Proxy - Woher Seiten wirklich kommen Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |