Session und Cookies
Mit Hilfe von Sessions und Cookies ist es möglich, anfrage- aber auch seitenübergreifend Daten zu speichern. Diese Daten werden dabei je nach verwendetem Typ client- oder serverseitig gespeichert. Eine solche Technologie kann z. B. für Warenkörbe oder Merklisten in Online-Shops, die „Angemeldet bleiben“-Funktion in Foren und vielen mehr eingesetzt werden.
Session
Sessions (zu Deutsch Sitzung) erlauben das anfrage- und seitenübergreifende Speichern von Informationen. In einer Session können mehrere sogenannte Session-Variablen (im Java-Umfeld auch als Session-Attribute bezeichnet) abgelegt werden.
Die Speicherung der Werte von Session-Variablen erfolgt auf dem Webserver, d. h. diese können vom Besucher nicht manipuliert
werden. Technisch realisiert wird eine Session mit Hilfe eines Cookies (Cookie-Name JSESSIONID
). Dieses
Cookie hat eine Lebensdauer von 0
, d. h. das Cookie gilt so lange wie der Browser geöffnet bleibt. Der Server
speichert die Session auch nur für einen begrenzten Zeitraum. Dieser Zeitraum wird in der Datei web.xml
(XML-Element session-timeout
) festgelegt.
Eine Session wird in Java-EE-Anwendungen durch das Interface HttpSession
(Package javax.servlet.http
)
repräsentiert. Um ein Session-Objekt abzurufen, wird die Funktion getSession()
des Interfaces HttpServletRequest
genutzt. Der Funktion kann ein Wert vom Typ boolean
übergeben werden, welcher angibt, ob die Session, falls diese
nicht existiert, erstellt werden soll. false
gibt an, dass die Session nicht erstellt werden soll und somit gibt
die Funktion getSession()
, wenn bisher keine Session existiert, null
zurück. Wird der Parameter
weggelassen oder wird der Wert true
übergeben, so wird eine Session erstellt, falls noch keine existiert.
Bei der „ersten“ Erstellung der Session wird das Cookie JSESSIONID
angelegt und an den Client zurückgesendet.
Das Interface HttpSession
enthält drei wichtige Funktionen: getAttribute()
, setAttribute()
,
removeAttribute()
. Mit der Funktion getAttribute()
kann ein Session-Attribut abgerufen werden.
Existiert das Attribut nicht, so gibt die Funktion null
zurück. Mit setAttribute()
kann der Wert
eines Session-Attributs gesetzt bzw., sofern das Attribut noch nicht existiert, das Session-Attribut angelegt werden.
removeAttribute()
erlaubt das Entfernen eines Attributs aus einer Session. Die Werte von Session-Attributen
sind vom Typ Object
. Dadurch ist es möglich, komplette Objekte einer (eigenen) Klasse zu speichern.
Im folgenden Beispiel haben Sie zwei Eingabefelder. Die dort eingegebenen Werte werden in der Session gespeichert. Wenn Sie die Beispiel-Ansicht öffnen, dort Werte eingeben, auf „Speichern“ klicken, den Tab schließen und anschließend das Beispiel erneut öffnen, werden Sie feststellen, dass die eingegebenen Werte (Vorname und Nachname) „erhalten geblieben“ sind.
package de.hwh.bsp.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class SessionServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession oSession; String sVorname, sNachname; // Zeichenkodierung auf UTF-8 setzen (für Formulardaten) request.setCharacterEncoding("UTF-8"); // Session abrufen oder erstellen (falls diese noch nicht existiert) oSession = request.getSession(true); // Prüfen ob die Anfrage mittels der POST-Methode durchgeführt wurde if (request.getMethod() == "POST") { // Werte aus dem Formular abrufen sVorname = request.getParameter("vorname") != null ? request.getParameter("vorname") : ""; sNachname = request.getParameter("nachname") != null ? request.getParameter("nachname") : ""; // Werte in der Session speichern oSession.setAttribute("vorname", sVorname); oSession.setAttribute("nachname", sNachname); } else { // Werte aus der Session abrufen sVorname = oSession.getAttribute("vorname") != null ? oSession.getAttribute("vorname").toString() : ""; sNachname = oSession.getAttribute("nachname") != null ? oSession.getAttribute("nachname").toString() : ""; } // Ausgabe als HTML-Seite response.setContentType("text/html;charset=UTF-8"); // Ausgabe durchführen PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println(" <head>"); out.println(" <title>Session - Java EE Servlet Code-Beispiel</title>"); out.println(); out.println(" <meta charset=\"utf-8\" />"); out.println(); out.println(" <meta name=\"robots\" content=\"noindex,nofollow\" />"); out.println(" <meta name=\"publisher\" content=\"Homepage-Webhilfe\" />"); out.println(" </head>"); out.println(); out.println(" <body style=\"line-height: 1.5em;\">"); out.println(" <form method=\"post\">"); out.println(" Vorname: <input type=\"text\" name=\"vorname\" value=\"" + sVorname + "\" /><br />"); out.println(" Nachname: <input type=\"text\" name=\"nachname\" value=\"" + sNachname + "\" /><br />"); out.println(" <input type=\"submit\" value=\"Speichern\" />"); out.println(" </form>"); out.println(" </body>"); out.println("</html>"); out.close(); } }
Cookies
Mit Cookies ist es, anders als bei einer Session, möglich, Daten über eine Sitzung hinaus zu speichern. Durch eine solche Funktionalität ist es z. B. möglich, dass ein Benutzer über mehrere Browser-Sitzungen in einem Forum angemeldet bleiben kann. In einem Cookie kann jedoch, anders als in einer Session, nur ein Wert gespeichert werden. Sollen mehrere Werte gespeichert werden, so sind mehrere Cookies notwendig.
Die technische Realisierung von Cookies erfolgt über das HTTP-Protokoll mittels der Headerfelder Cookie
und
Set-Cookie
. Die Speicherung des Cookies selbst erfolgt clientseitig (im Cache des Browsers). Wird ein Cookie
vom Server „geschrieben“, so sendet der Webserver das Headerfeld Set-Cookie
. Dies geschieht einmalig. Bei jeder
Anfrage an den Server sendet der Client (Browser) das Headerfeld Cookie
zurück. Dadurch kennt der Server den Wert
des Cookies und kann diesen in der Anwendung verarbeiten.
Cookies werden in Java-Webanwendungen durch die Klasse Cookie
(Package javax.servlet.http
) repräsentiert.
Eine Liste aller erhaltenen Cookies (diese wurden vom Client durch das Headerfeld Cookie
an den Server gesendet) kann
über die Methode getCookies()
des HttpServletRequest
-Interfaces abgerufen werden. Um der HTTP-Antwort
ein Cookie anzufügen (dies wird vom Server durch das Headerfeld Set-Cookie
an den Client gesendet), können Sie die
Funktion addCookie()
des HttpServletResponse
-Interfaces nutzen. Dieser Funktion wird ein Objekt der
Cookie
-Klasse übergeben, welche nach Belieben erzeugt werden kann.
Dem Konstruktor der Cookie
-Klasse werden zwei Zeichenketten übergeben: Cookie-Name und Cookie-Wert. Die
folgende Tabelle zeigt eine Auflistung der wichtigsten Funktionen zum Festlegen und Abrufen von verschiedenen Eigenschaften:
getName() | Gibt den Namen des Cookies zurück oder legt diesen fest. |
---|---|
setName() | |
getValue() | Gibt den Wert des Cookies zurück oder legt diesen fest. |
setValue() | |
getMaxAge() | Gibt die Lebensdauer des Cookies zurück oder legt diese fest. |
setMaxAge() | |
getDomain() | Gibt die Domain, in welchem das Cookie gültig ist, zurück oder legt diese fest. |
setDomain() | |
getPath() | Gibt den Pfad, in welchem das Cookies gültig ist, zurück oder legt diesen fest. |
setPath() |
Hierzu nun ein Beispiel, welches, wie das Beispiel zu Sessions, ein Feld für einen Vor- und Nachnamen besitzt. Diese Werte werden über zwei Cookies gespeichert. Diese Cookies besitzen dabei eine Lebensdauer von 1 Stunde.
package de.hwh.bsp.cookies; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CookieServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie oVornameCookie = null, oNachnameCookie = null; String sVorname, sNachname; // Zeichenkodierung auf UTF-8 setzen (für Formulardaten) request.setCharacterEncoding("UTF-8"); // Cookies abrufen if (request.getCookies() != null) { for (Cookie oCookie : request.getCookies()) { if (oCookie.getName().equals("vorname")) oVornameCookie = oCookie; else if (oCookie.getName().equals("nachname")) oNachnameCookie = oCookie; } } // Prüfen ob die Anfrage mittels der POST-Methode durchgeführt wurde if (request.getMethod() == "POST") { // Werte aus dem Formular abrufen sVorname = request.getParameter("vorname") != null ? request.getParameter("vorname") : ""; sNachname = request.getParameter("nachname") != null ? request.getParameter("nachname") : ""; // Cookies speichern, Werte darin speichern und diese der Antwort hinzufügen oVornameCookie = new Cookie("vorname", sVorname); oVornameCookie.setMaxAge(3600); response.addCookie(oVornameCookie); oNachnameCookie = new Cookie("nachname", sNachname); oNachnameCookie.setMaxAge(3600); response.addCookie(oNachnameCookie); } else { // Werte aus den Cookies abrufen sVorname = oVornameCookie != null ? oVornameCookie.getValue() : ""; sNachname = oNachnameCookie != null ? oNachnameCookie.getValue() : ""; } // Ausgabe als HTML-Seite response.setContentType("text/html;charset=UTF-8"); // Ausgabe durchführen PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println(" <head>"); out.println(" <title>Cookies - Java EE Servlet Code-Beispiel</title>"); out.println(); out.println(" <meta charset=\"utf-8\" />"); out.println(); out.println(" <meta name=\"robots\" content=\"noindex,nofollow\" />"); out.println(" <meta name=\"publisher\" content=\"Homepage-Webhilfe\" />"); out.println(" </head>"); out.println(); out.println(" <body style=\"line-height: 1.5em;\">"); out.println(" <form method=\"post\">"); out.println(" Vorname: <input type=\"text\" name=\"vorname\" value=\"" + sVorname + "\" /><br />"); out.println(" Nachname: <input type=\"text\" name=\"nachname\" value=\"" + sNachname + "\" /><br />"); out.println(" <input type=\"submit\" value=\"Speichern\" />"); out.println(" </form>"); out.println(" </body>"); out.println("</html>"); out.close(); } }