Ansichtszustand, Session und Cookies
Immer wieder werden Sie in die Situation kommen, dass Sie Daten des aktuellen Besuchers speichern möchten. Diese Daten sollen dann z. B. nur für diese Seite, nur für diese Sitzung oder sogar länger gelten. Wichtig dabei ist jedoch immer, dass die Daten eben nur für diesen einen bestimmten Besucher gelten. In PHP haben Sie dafür Sessions und Cookies kennengelernt. Diese gibt es auch in ASP.NET. Zudem bietet uns ASP.NET die Möglichkeit, Daten im sogenannten Ansichtszustand zu speichern. In diesem Thema wollen wir Ihnen die verschiedenen Speicherungsmöglichkeiten erklären und mit einem Beispiel verdeutlichen.
Ansichtszustand
Mit dem Ansichtszustand (engl. view state) ist es möglich, Daten auf der Seite zu speichern. Diese Methode
wird unter anderem auch dazu verwendet, die Werte und Ereignisstatusse von Steuerelementen nach einem Postback beizubehalten.
Diese Speicherung geschieht jedoch bereits automatisch. Die Daten des Ansichtszustands werden in versteckten Eingabefeldern
gespeichert und mit BASE-64 enkodiert. Diese Zeichenkette kann ohne viel Aufwand dekodiert, manipuliert und wieder zurück
enkodiert werden. Speichern Sie hier also niemals sicherheitsrelevante Daten. Im Ansichtszustand können Daten
innerhalb von Variablen gespeichert werden. Um auf diese Variablen zuzugreifen, können wir die Eigenschaft
ViewState
(des aktuellen Page
-Objekts) nutzen. Der lesende Zugriff erfolgt mittels den eckigen
Klammern []
(wie bei Arrays). Existiert eine Variable nicht, wird null
zurückgegeben. Dieser
Syntax kann natürlich auch verwendet werden, wenn ein Wert überschrieben werden soll. Hier sollte jedoch bevorzugt die
Funktion Add()
verwendet werden, da diese auch dazu genutzt werden kann, eine neue Variable zu deklarieren.
Existiert die Variable schon, so ersetzt die Funktion Add()
den Wert der Variablen durch den neuen, welcher
angegeben wurde. Als Parameter übergeben wir der Funktion den Namen der Variable und den Wert (dabei kann es sich um eine
Zeichenkette, eine Zahl oder einen anderen Wert handeln). Mittels der Funktion Remove()
kann eine bestimmte
Variable des Ansichtszustands wieder entfernt werden. Im Beispiel wird eine Zufallszahl generiert und diese im Ansichtszustand
gespeichert. Beim Klicken auf den Button wird die Seite „gepostet“ und eine neue Zufallszahl generiert und angezeigt. Zudem
wird die vorherige Zahl ausgelesen und ebenfalls angezeigt. Dieser Vorgang kann mehrmals wiederholt werden, wovon immer die
letzte Zufallszahl „erhalten“ bleibt.
<form runat="server"> <b>Aktuelle Zufallszahl:</b> <%= iZufallAktuell %><br /> <b>Letzte Zufallszahl:</b> <%= sZufallLetzte %><br /> <br /> <input type="submit" value="Seite erneut aufrufen" /> </form>
using System; namespace HWhBsp.Ansichtszustand { public partial class Default : System.Web.UI.Page { protected int iZufallAktuell; protected string sZufallLetzte; protected void Page_Load(object sender, EventArgs e) { iZufallAktuell = (new Random()).Next(1, 1001); sZufallLetzte = ViewState["LetzterZufall"] != null ? (string)ViewState["LetzterZufall"] : "-"; ViewState.Add("LetzterZufall", iZufallAktuell.ToString()); } } }
Wichtig: Wenn Sie die Seite „manuell“ erneut aufrufen (z. B. durch erneute Eingabe der URL oder durch klicken auf einen Link), so sind die Daten des Ansichtszustands verloren. Die Daten bleiben also lediglich zwischen Postbacks erhalten.
Session
Session-Variablen (zu Deutsch Sitzungs-Variablen) ermöglichen es, Daten über eine Seite hinaus zu speichern. Technisch
realisiert werden Sessions mit einem Cookie, welches eine Dauer von 0 hat und somit bis zum Schließen des Browsers gültig ist.
Dadurch sind auch die Daten bis zum Schließen des Browsers gültig. Die Session-Variablen werden auf dem Server gespeichert.
Im Browser wird leidglich eine Session-ID (in Form eines Cookies, wie oben beschrieben) gespeichert. Der Browser schickt
bei jeder Anfrage diese Session-ID zurück an den Webserver, wodurch dieser die Variablen, welche zur Session gehören, zuordnen
kann. Der Zugriff auf Session-Variablen ist vergleichbar mit dem für den Ansichtszustands. Als Eigenschaft wird hier
Session
verwendet. Session
enthält ein Objekt, bei welchem auch über die Indizierung (mittels einem
eckigen Klammernpaar) zugegriffen werden kann. Die Funktionen Add()
und Remove()
sind hier ebenfalls
verfügbar. Des Weiteren gibt es hier die Funktion RemoveAll()
, mit welcher alle Variablen der Sitzung gelöscht
werden können. Das folgende Beispiel ist mit dem Ansichtszustands-Beispiel vergleichbar, speichert jedoch die Zufallszahl auch
über einen erneuten (manuellen) Seitenaufruf hinaus.
<form runat="server"> <b>Aktuelle Zufallszahl:</b> <%= iZufallAktuell %><br /> <b>Letzte Zufallszahl:</b> <%= sZufallLetzte %><br /> <br /> <input type="submit" value="Seite erneut aufrufen" /> </form>
using System; namespace HWhBsp.Session { public partial class Default : System.Web.UI.Page { protected int iZufallAktuell; protected string sZufallLetzte; protected void Page_Load(object sender, EventArgs e) { iZufallAktuell = (new Random()).Next(1, 1001); sZufallLetzte = Session["LetzterZufall"] != null ? (string)Session["LetzterZufall"] : "-"; Session.Add("LetzterZufall", iZufallAktuell.ToString()); } } }
Cookies
Cookies erlauben das Speichern von Informationen über eine Sitzung hinaus. Cookies haben eine bestimmte Gültigkeitsdauer,
welche beim Setzen des Cookies angegeben werden muss. Des Weiteren kann ein Cookie auf einen Pfad beschränkt werden.
Cookies werden vom Server „geschrieben“, vom Browser gespeichert und verwaltet und bei einer Anfrage an den Server wieder zurück
an den Server übertragen. Durch die Tatsache, dass die Cookie-Werte im Browser gespeichert werden, können diese Werte ebenfalls
manipuliert werden. Speichern Sie also auch hier niemals sicherheitsrelevante Daten. Cookies werden in ASP.NET durch ein Objekt
der Klasse HttpCookie
repräsentiert. Die Eigenschaft Name
legt den Namen fest, Value
den Wert,
Path
den Pfad, in welchem das Cookie gültig ist (gilt auch für dessen Unterverzeichnisse), und Expires
den Ablaufzeitpunkt, ab wann das Cookie nicht mehr gültig ist (und somit vom Browser verworfen wird). Dem Konstruktor der Klasse
HttpCookie
kann der Name und Wert des Cookies übergeben werden, wovon der Parameter für den Wert optional ist. Die
Cookies, welche vom Browser gesendet und vom Server empfangen wurden, können über die Eigenschaft Cookies
der
HttpRequest
-Klasse abgerufen werden. Ein Zugriff auf die (neuen) Cookies, welche „geschrieben“ bzw. „gesetzt“ werden
sollen, erhalten Sie über die Eigenschaft Cookies
der HttpResponse
-Klasse. Um ein neues Cookie zu
„deklarieren“, können wir die Funktion Add()
verwenden.
<form runat="server"> <b>Aktuelle Zufallszahl:</b> <%= iZufallAktuell %><br /> <b>Letzte Zufallszahl:</b> <%= sZufallLetzte %><br /> <br /> <input type="submit" value="Seite erneut aufrufen" /> </form>
using System; using System.Web; namespace HWhBsp.Cookies { public partial class Default : System.Web.UI.Page { protected int iZufallAktuell; protected string sZufallLetzte; protected void Page_Load(object sender, EventArgs e) { iZufallAktuell = (new Random()).Next(1, 1001); sZufallLetzte = Request.Cookies["LetzterZufall"] != null ? Request.Cookies["LetzterZufall"].Value : "-"; Response.Cookies.Add(new HttpCookie("LetzterZufall", iZufallAktuell.ToString()) { Expires = DateTime.Now.AddHours(1) }); } } }