Homepage-Webhilfe Event-Banner

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-Icon 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();
    }
}
VorschauDownload

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();
    }
}
VorschauDownload
Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen OK