HTTP-Servlets

HTTP-spezische Eigenschaften eines Servlet sind in einem speziell dafür entworfene Package implementiert. In Tab. 13-5 und Tab. 13-6 sind die Interfaces und Klassen dieses Packages aufgelistet.

Interface

Bedeutung

HttpServletRequest

Das Interface HttpServletRequest erweitert das Interface ServletRequest und erlaubt darüber hinaus den Zugriff auf HTTP_spezifische Eigenschaften von Anfragen.

HttpServletResponse

Das Interface HttpServletResponse erweitert das Interface ServletResponse und erlaubt darüber hinaus den Zugriff auf HTTP_spezifische Eigenschaften der Antwort.

HttpServletSession

Das Interface HttpSession wird von Diensten implementiert, um eine dauerhafte Verbindung zwischen dem HTTP-Client und dem HTTP-Server zu erzeugen. Eine Session kann bspw. durch die Verwendung von Cookies aufrecht erhalten werden.

HttpSessionBindingL istener

Dieses Interface wird von Objekten implementiert, die sich für ein HttpSessionBindingEvent-Objekt registrieren.

HttpSessionContext

Das Interface HttpSessionContext gruppiert eine Menge von HTTP-Sessions mit einer eindeutigen ID.

Tab. 13.5: Interfaces des Packages javax.servlet.http

Klassen

Bedeutung

Cookie

Diese Klasse repräsentiert ein Cookie.

HttpServlet

Diese Klasse stellt eine Erweiterung des Interfaces Servlet dar. Da die meisten Webserver HTTP benutzen, um mit ihren Clients zu kommunizieren, erweitern viele Servlets diese Klasse, die ein Grundgerüst für die Nutzung von HTTP zur Verfügung stellt.

HttpSessionBindingE vent

Dieses Ereignis wird ausgelöst, wenn ein Listener von einem HTTPSession-Objekt gebunden oder gelöst wird. Ein HttpSession-Objekt stellt daher eine Event-Quelle dar. Das Binden erfolgt, wenn die Methode HttpSession.putValue() aufgerufen wird. Die Freigabe erfolgt, wenn die Methode HttpSession.removeValue aufgerufen wird.

HttpUtils

Diese Klasse beinhaltet eine Menge von Hilfsmethoden für HTTP-Servlets.

Tab. 13.6: Klassen des Packages javax.servlet.http

Klasse HTTPServlet

Viele Daten werden im Internet mit Hilfe des HTTP-Protokolls übertragen. Die Klasse javax.servlet.http.HttpServlet erweitert die Klasse javax.servlet.GenericServlet, damit HTTP-spezifische Anfragen bearbeitet werden können. Sie stellt damit eine Standardimplementierung des Interfaces javax.servlet.Servlet dar. Programmierer von Servlets müssen diese Klasse erweitern. Die Syntax für eine solche Erweiterung lautet:

syntax 

public class meinHTTPServlet extends HttpServlet

Die Standardimplementierung der Klasse javax.servlet.http.HttpServlet erkennt die Standardmethoden von HTTP/1.1 (bspw. GET, PUT oder POST) [rfc2068] und ruft die jeweils zugehörige do-Methode (doGet(), doPut() oder doPost()) auf. Die wichtigsten Methoden des HTTP-Protokolls sind in Tab. 13-7 aufgeführt

Methode

Beschreibung

GET

Anforderung zum Lesen eines Web-Dokuments.

HEAD

Anforderung zum Lesen des Headers eines Web-Dokuments.

POST

Anfügen der Daten an eine Ressource (z. B. News).

POST

Anforderung, ein neues Dokument auf dem Server zu speichern.

DELETE

Löscht ein angegebenes Dokument vom Server.

Tab. 13.7: Die wichtigsten HTTP-Methoden

So behandelt bspw. die doGet-Methode der Klasse HTTPServlet solche Anfragen, die mit Hilfe der HTTP-Methode GET gestellt werden. Die doPost-Methode muss überschrieben werden, wenn die HTTP-Anfrage POST bearbeitet werden soll. Ein HTTP-Servlet bearbeitet Client-Anfragen mit Hilfe der service-Methode. Diese Methode dient in der Regel nur als Kommando-Container und wird nur in Ausnahmefällen überschrieben. Sie leitet jede ankommende Anfrage gemäß der HTTP_Methode an die entsprechende HttpServlet-Spezialmethode weiter, also bspw. GET_Anfragen an die doGet-Methode und POST_Anfragen an die doPost-Methode. Im Folgenden sind die Methoden der Klasse HttpServlet aufgelistet, die von der service-Methode an die entsprechenden HTTP-Methoden weiterleitet werden.

  • doGet, um GET-Anfragen, bedingte GET-Anfragen und HEAD-Anfragen zu bearbeiten.
  • doPost zur Bearbeitung von POST-Anfragen.
  • doPut, um PUT-Anfragen zu bearbeiten.
  • doDelete zur Bearbeitung von DELETE-Anfragen.
  • doOptions zur Bearbeitung von OPTION-Anfragen.
  • doTrace, um TRACE-Anfragen zu bearbeiten.
  • Methoden, die nicht unterstützt werden, werden mit dem HTTP-Fehler Bad Request quittiert (im Browser durch die Zahl 400 repräsentiert).

Ist das Servlet initialisiert, so können HTTP-Anfragen beantwortet werden. Wie jede service-Methode akzeptieren alle do-Methoden zwei Parameter: Der erste Parameter ist ein Objekt der Klasse HttpServletRequest, der zweite Parameter stellt ein Objekt der Klasse HttpServletResponse dar. Als Unterklassen von ServletRequest bzw. ServletResponse repräsentieren die Klassen HttpServletRequest und HttpServletResponse die Anfrage eines Clients bzw. die Antwort eines Servlets. Darüber hinaus erlauben sie aber auch den Zugriff auf die HTTP_spezifischen Eigenschaften der Anfragen und Antworten

Interface HTTPServletRequest

Das Interface HttpServletRequest erweitert das Interface ServletRequest und erlaubt darüber hinaus den Zugriff auf die HTTP_spezifischen Eigenschaften von Anfragen eines Clients, die an einen Server gesendet werden. Klassen, die dieses Interface implementieren, können bspw. auf Client-Informationen zugreifen, wie bspw. auf die Bezeichnung der vom Client gesendeten Parameter, das vom Client verwendete Protokoll, den Namen der Client-Maschine oder den Namen des Servers, der die Anfrage empfängt. Der Zugriff auf eine Client-Anfrage kann folgendermaßen erfolgen:

  • Durch die Verwendung der getParameter-Methode.
  • Durch die Verwendung der getQueryString-Methode bei der HTTP-Anfrage GET. Die Methode liefert ein String-Objekt zurück, das verarbeitet werden muss, um die Parameter und deren Werte auslesen zu können.
  • Durch die Verwendung der getReader-Methode bei den HTTP-Anfragen POST, PUT oder DELETE. Diese Methode liefert ein BufferedReader-Objekt zurück und wird verwendet, falls Textdaten empfangen werden sollen. Werden dagegen binäre Daten übertragen, so wird die getInputStream-Methode verwendet, die ein ServletInputStream zurückliefert.

Eine der Schlüsselmethoden der Klasse HttpServletRequest, die vom Interface javax.servlet.ServletRequest vererbt wird, ist die Methode getParameter(). Ein Aufruf dieser Methode liefert das Argument des entsprechenden Parameters zurück, bzw. falls dieser nicht existiert, eine Null-Referenz. Hierbei handelt es sich um einen Parameter, der bspw. von einem Browser bei der Betätigung des Absenden-Knopfs eines Formulars übergeben wird. Wenn nicht davon ausgegangen werden kann, dass nur ein Parameter übergeben wird (bspw. eine Aufzählung bei einem HTML-Formular mit einem <SELECT>-Feld), so wird anstelle der getParameter()-Methode die getParameterValues()-Methode aufgerufen. Diese Methode gibt ein Feld aller übergebenen Parameter zurück. Das Auslesen von dokumentspezifischen Parametern kann wie folgt realisiert werden:

code 

String  parameter = request.getParameter(String name);

Dieser Aufruf liefert dann den Parameter zurück, der durch name gekennzeichnet ist. Derartige Parameter werden im HTML-Code festgelegt. Als Beispiel dient folgender Code:

code 

String  Nachname = request.getParameter ("name");

Eine Alternative dazu ist die Aufzählung sämtlicher Parameternamen:

code 

Enumeration names = request.getParameterNames();

Zum Auslesen von HTTP-Anfrageparametern stehen u. a. die folgenden Methoden der Klassen javax.servlet.http.HttpServletRequest und javax.servlet.ServletRequest zur Verfügung:

  • String    methode = request.getMethod();
    Diese Methode übergibt die entsprechende HTTP-Methode, bspw.
    GET oder POST.
  • String uri = request.getRequestURI();
    Hierbei wird der Uniform Resource Identifier (URI) des Senders zur Identifikation übergeben. Der URI wird durch das Lesen der ersten Zeile einer HTTP-Anfrage bestimmt. Eine HTTP-Anfrage besteht aus der verwendeten HTTP-Methode, gefolgt von der URI und der HTTP-Version.
  • GET /path/index.html HTTP/1.1.
    Die Methode
    getRequestURI() liefert den Wert /path/index.html. Mittels der Anweisung String pathInfo = request.getPathInfo(); wird die im Dokumentenpfad gespeicherte Information übergeben.
  • int length = request.getContentLength(); übergibt die Länge der Anfragedaten. Diese Methode ist gleichbedeutend mit der CGI-Variablen CONTENT_LENGTH.
  • String type = request.getContentType(); übergibt den Datentyp des verwendeten Mediums. Dieser Typ ist gleichbedeutend mit der CGI-Variablen CONTENT_TYPE.

Zum Interface HTTPServletRequest gehören unter anderem auch die folgenden Methoden:

  • getAuthType()
    Diese Methode erfragt das Authentifizierungsschema der Anfrage.
  • getCookies()
    Diese Methode erfragt der Liste der Cookies, die in dieser Anfrage enthalten sind.
  • getDateHeader(String)
    Diese Methode erfragt den Wert des Datums des Headers.
  • getHeader(String)
    Diese Methode erfragt die Header-Informationen einer Anfrage.
  • getHeaderNames()
    Diese Methode erfragt die Namen der Header-Informationen.
  • getIntHeader(String)
    Diese Methode erfragt den Wert des als Argument übergebenen Header-Feldes der Anfrage.
  • isRequestedSessionIdFromCookie()
    Diese Methode erfragt, ob die Anfrage mit einem Cookie-Objekt empfangen wurde.

Interface HTTPServletResponse

Das Interface javax.servlet.http.ServletResponse erweitert das Interface ServletResponse und erlaubt darüber hinaus den Zugriff auf die HTTP_spezifischen Eigenschaften von Antworten, die von einem Server an einen Client gesendet werden. Klassen, die dieses Interface implementiert haben, können bspw. die Größe der gesendeten Antwort und deren MIME-Datentyp setzen.

Ein HttpServletResponse-Objekt bietet zwei Möglichkeiten, Daten an den Client zu senden:

  • Die getWriter-Methode liefert ein Writer-Objekt und wird verwendet, falls es sich um eine textbasierte Antwort handelt.
  • Die getOutputStream-Methode liefert ein ServletOutputStream-Objekt. Diese Methode wird dann verwendet, wenn es sich um eine Antwort handelt, die binäre Daten enthält.

Das Schließen des Writer-Objekts bzw. des ServletOutputStream-Objekts mit Hilfe der close-Methode nach dem Empfang der Antwort erlaubt es dem Server, festzustellen, ob die Antwort vollständig ist.

code 

public class EinfachesServlet extends HttpServlet {

    // Verwende die HTTP-Methode GET, um eine einfache Webseite
    // zu erzeugen.

    public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      PrintWriter out;
      String title = "Einfaches Servlet: Output";

      // lege den Datentyp des Inhalts der Antwort fest
      response.setContentType("text/html");

      // Schreibe die Antwort als Text
      out = response.getWriter();
      out.println("<HTML><HEAD><TITLE>");
      out.println(title);
      out.println("</TITLE></HEAD><BODY>");
      out.println("<H1>" + title + "</H1>");
      out.println("<P>Dies ist der Body-Teil dieser Seite.");
      out.println("</BODY></HTML>");

      // Schließen des Writer-Objekts, damit der Server erkennt,
      // dass das Ende der Antwort erreicht ist.
      out.close();

    }

    // Die doPost-Methode ruft die doGet-Methode auf
    public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

      doGet(request, response)

    }

}

Eine einfache HTTP-Antwort beginnt im Unterschied zu einer HTTP-Anfrage mit der Version des unterstützten Protokolls, gefolgt von einem Status-Code und einem Kommentar zum Status-Code:

code 

HTTP/Versionsnummer Status-Code Reason-Phrase

Ein Beispiel für eine derartige Antwort ist im Folgenden angegeben.

code 

HTTP/1.0 200 OK

Die Versionsnummer gibt an, in welcher Version das HTTP-Protokoll läuft (Version 1.0 oder Version 1.1). Der Status-Code einer Antwort ist ein ganzzahliger Wert, der aus drei Ziffern besteht. Die erste Ziffer ist die wichtigste, da sie die Antwortkategorie identifiziert:

  • 1xx: Beschreibt eine Informationsnachricht.
  • 2xx: Zeigt eine erfolgreiche Ausführung an:
    • 200 OK: Erfolgreiche Anfrage.
    • 201 OK: Neue Ressource erzeugt (bei einer POST-Methode).
    • 204 OK: Aber kein Inhalt.
  • 3xx: Leitet den Client zu einer anderen Adresse um.
  • 4xx: Zeigt einen Fehler beim Client an.
    • 400: Falsche Anfrage.
    • 401: Client hat sich nicht authentifiziert.
    • 403: Verbotener Zugriff auf das Dokument.
    • 404: Dokument wurde nicht gefunden.
  • 5xx: Zeigt einen Fehler beim Server an.
    • 500: Interner Fehler (beim Server).

Der sog. Reason-Nachrichtsteil ist ein Beschreibungstext des Status-Codes. Für die Ausgabe der Ergebnisse (sog. Response) wird ein Outputstream-Objekt erzeugt:

code 

ServletOutputStream out = response.getOutputStream();

Alle Daten, die in diesen Stream geschrieben werden, werden automatisch an den Client weitergeleitet (bspw. HTML-Code). Aufgrund dieses Mechanismus kann das Ergebnisdokument dynamisch erzeugt werden.

Ein Servlet muss immer mit Hilfe der Methode setStatus() einen HTTP-StatusCode zurückgeben, um bspw. dem Client den Erfolg einer Abfrage mitzuteilen. Verläuft die Ausführung des Servlets ordnungsgemäß, kann man mit der response.setStatus(Statuscode)-Methode den Statuscode auf den Wert SC_OK setzen. Status-Codes sind in Tab. 13-8 aufgeführt.

Die Methode setStatus kann zusätzlich zum Status-Code eine Statusmeldung entsprechend der HTTP-Spezifikationen zurückliefern:

code 

setStatus(Statuscode, Statusmeldung);

Tab. 13-8 listet die wichtigsten Status-Code-Variablen der Klasse javax.servlet.http.ServletResponse auf.

Variablen der Klasse javax.servlet.http.Http ServletResponse

Bedeutung

SC_OK

Erfolgreiche Anfrage

SC_ACCEPTED

Erfolgreiche, aber unvollständige Anfrage

SC_FORBIDDEN

Erfolgreiche Anfrage, aber Server verweigert bspw. aus Sicherheitsgründen die Bearbeitung dieser Anfrage

SC_MULTIPLE_CHOICES

Client zu einer anderen Adresse weitergeleitet

SC_UNAUTHORIZED

Client konnte sich nicht authentifizieren

SC_NOT_FOUND

Angefragtes Dokument wurde nicht gefunden

SC_UNSUPPORTED_MEDIA_TYPE

Angefragter Medientyp kann nicht unterstützt werden

Tab. 13.8: Variablen von HTTP-Status-Codes

Zur Erläuterung und Auflistung weiterer HTTP-Status-Codes sei an dieser Stelle auf die Literatur verwiesen [rfc1945, rfc2068]. Zusätzlich zu den oben angegebenen Methoden enthält diese Klasse die folgenden Methoden:

  • addCookie(Cookie)
    Diese Methode fügt der Antwort den angegebenen Cookie hinzu.
  • containsHeader(String)
    Diese Methode liefert den Wert true zurück, falls das angegebene String-Objekt in der Antwort enthalten ist, ansonsten den Wert false.
  • sendError(int)
    Diese Methode sendet eine Antwort, die den entsprechenden Status-Code beinhaltet, an den Client.
  • sendError(int, String)
    Diese Methode sendet eine Antwort an den Client, die zusätzlich zum entsprechenden Status-Code eine Beschreibung des Status-Codes beinhaltet.
  • sendRedirect(String)
    Diese Methode zeigt dem Client eine temporäre Umleitung mit einer temporären URL an. Diese URL muss in der absoluten Form http://hostname/path/file.html angegeben werden. Die Verwendung relativer URLs ist hierbei nicht erlaubt.
  • setHeader(String, String)
    Diese Methode fügt der Antwort ein Datenfeld hinzu, das sowohl die Header-Bezeichnung als auch dessen Wert beinhaltet.
  • setIntHeader(String, int)
    Diese Methode fügt der Antwort ein Datenfeld hinzu, das sowohl die Header-Bezeichnung als auch dessen int-Wert beinhaltet.

HTTP-Sessions

Ein Problem von HTTP ist, dass das Protokoll zustandslos ist. Hierdurch ist es schwierig, eine Kommunikation zu etablieren, die Anfragen und Antworten in mehreren Schritten ausführen. Mittels des sog. Session Tracking kann ein Servlet eine eingehende Anfrage mit einem Client assoziieren, wodurch sich eine Sitzung über mehrere Anfragen und Antworten hinaus ausdehnen kann. Die hierzu notwendigen Schritte sind:

  1. Erzeugung eines HttpSession-Objekts für einen Client.
  2. Abspeichern und Laden der Daten dieses HttpSession-Objekts.
  3. Beendigung des HttpSession-Objekts (optional).

Sitzungen können aufrechterhalten werden, indem Cookies verwendet werden, bzw. indem URLs weitergeleitet werden (Rewriting URLs). Die URL-Weiterleitung ist allerdings gegenüber Cookies unkomfortabel und bedeutet meist für den Programmierer von Servlets zusätzlichen Programmieraufwand. Die Weiterleitung wird daher nur verwendet, wenn Sitzungsinformationen notwendig sind und keine Cookies zur Verfügung stehen. Als Beispiel hierfür wird die Seite <A HREF="nextpage.html"> auf die Seite <A HREF="nextpage.html;$sessionid$=DSJFSDKFSLDFEEKOE"> umgelenkt. Cookies werden in diesem Kapitel  ausführlich behandelt. Um festzustellen, ob der Client Cookies unterstützt, definiert die HttpSession-Klasse die Methode isCookieSupportDetermined. Um festzustellen, ob der Client Cookies tatsächlich verwendet, wird die Methode isUsingCookies zur Verfügung gestellt.

Das Interface HttpSession-Interface wird von Diensten implementiert, die eine dauerhafte Verbindung zwischen einem HTTP-Client und einem HTTP-Server aufrechterhalten wollen. Diese Verbindung wird über mehrere Anfragen und Antworten hinweg aufrechterhalten. Das folgende Beispiel stellt das Setzen und die Speicherung der Werte der Sitzung dar.

code 

// Erhalten des Session-Objekts.
// request repraesentiert das Request-Parameter des
// HTTPServlets
HttpSession session = request.getSession(true);

Eine HttpSession-Implementierung stellt den Server-Aspekt bezüglich der Session dar. Ein Server betrachtet eine Sitzung solange als neu, bis ein Client an der Session teilnimmt. Solange sich kein Client bei einer Session angemeldet hat, liefert die isNew-Methode den Wert true. Der Wert true ist daher wie folgt zu verstehen:

  • Der Client kennt die Sitzung (noch) nicht.
  • Die Sitzung hat noch nicht begonnen.
  • Der Client nimmt (noch) nicht an der vorhandenen Sitzung teil. Dieser Fall tritt ein, wenn der Client bspw. keine Cookies akzeptiert. Eine andere Möglichkeit tritt dann ein, wenn der Server URLs umleitet (URL Rewriting).

Die Verarbeitung einer Sitzung ist eine Aufgabe des Programmierers. Der folgende Code leitet den Client zu einer neuen Adresse um, falls die Sitzung neu ist:

code 

//response repraesentiert das Response-Objekt des HTTPServlets
if (session.isNew()) {

    response.sendRedirect(URLderNeuenSeite);

}

Der Wert URLderNeueSeite bezeichnet hierbei die neue Adresse, zu der der Client automatisch umgeleitet wird, falls die Sitzung neu ist. Zu den Methoden des Interfaces HTTPSession gehören unter anderem:

  • getCreationTime()
    Diese Methode liefert die Zeit in Millisekunden zurück, zu der eine Sitzung erzeugt wurde.
  • getId()
    Diese Methode liefert die Identifikationsnummer einer Sitzung zurück.
  • getSessionContext()
    Diese Methode liefert den Kontext einer Sitzung zurück.
  • invalidate()
    Diese Methode annulliert die Sitzung und entfernt sie vom Kontext.
  • getValue(String)
    Diese Methode liefert ein Objekt zurück, das durch ein String-Objekt repräsentiert wird, wie bspw. die Session-ID.
  • putValue(String, Object)
    Diese Methode bindet das spezifizierte Objekt an das vorgegebene String-Objekt.

Cookies

Ein Cookie ist ein String-Objekt (im Falle eines Servlets stellt ein Cookie die ID einer Sitzung dar), das zu einem Client gesendet wird, um eine Sitzung zu starten. Wird die Sitzung fortgesetzt, so sendet der Client die Cookies mit den darauf folgenden Anfragen an den Server zurück. Die Verwendung von Cookies stellt die am weitesten verbreitete Methode dar, um Servlet-Sitzungen zu verfolgen.

Cookies [RFC 2109] sind Objekte, die Informationen beliebiger Art über den Client aufnehmen können und diese auf der lokalen Festplatte des Clients abspeichern. Wird dieselbe HTML-Seite bzw. das Servlet, für das ein Cookie-Objekt gespeichert wurde, nochmals aufgerufen, so wird das Cookie wieder an den Webserver zurückgeliefert und kann dort von einem CGI-Programm oder von einem Servlet ausgewertet werden. Durch dieses Konzept lassen sich benutzerspezifische Daten eines Clients abspeichern und beim erneuten Besuch einer Webseite wieder abrufen. Ein Cookie wird durch die Instantiierung der Klasse javax.servlet.http.Cookie erzeugt. Der Konstruktor dieser Klasse benötigt zwei Argumente, den Namen des Cookie-Objekts und dessen Wert.

code 

public Cookie(String name, String wert)

Nachdem ein Cookie-Objekt erzeugt wurde, können beliebige Parameter über die Methoden der Klasse Cookie festgelegt werden. Zu diesen Methoden gehören unter anderem:

  • setMaxAge(int)
    Diese Methode legt fest, wie alt ein Cookie maximal werden darf, bevor es von der Festplatte gelöscht wird.
  • getMaxAge()
    Diese Methode liefert die maximale Lebensdauer eines Cookie-Objekts beim Client zurück.
  • setComment(String)
    Diese Methode legt die an den Benutzer zu sendende Nachricht fest, die beim Erzeugen eines Cookies erscheinen soll.
  • getComment()
    Diese Methode liefert die Nachricht zurück, die beim Erzeugen eines Cookie erscheinen soll.
  • setVersion(int)
    Diese Methode legt die Version des verwendeten Cookie-Protokolls fest.
  • getVersion()
    Diese Methode liefert die Version des verwendeten Cookie-Protokolls zurück.
  • setSecure(boolean)
    Diese Methode teilt dem User-Agent (Browser) mit, dass das Cookie-Objekt nur mit dem sicheren HTTP-Protokoll HTTP-S verwendet werden darf.
  • getSecure()
    Diese Methode fragt das Sicherheits-Flag ab.
  • setDomain(String)
    Diese Methode setzt die Domäne für das Cookie-Objekt. Nur Hosts, deren Domäne der gesetzten Domäne entspricht, dürfen ein Cookie-Objekt senden bzw. erhalten. Standardmäßig werden Cookies nur an den Server zurückgesendet, der sie erzeugt hat.
  • getDomain()
    Diese Methode liefert die Domäne des Cookie-Objekts zurück.

Sind alle Eigenschaften der generierten Cookies festgelegt, so kann dieses durch Aufruf der addCookie-Methode des Interfaces javax.servlet.http.HttpServletResponse an den Browser gesendet werden. Durch Aufruf der getCookies-Methode des Interfaces javax.servlet.http.HttpServletRequest wird ein Array von allen Cookie-Objekten, die vom jeweiligen Servlet angelegt wurden, zurückgeliefert, die anschließend ausgewertet werden können. Der Cookie-Mechanismus funktioniert wie folgt:

  1. Der Browser sendet eine Anfrage (Request) ohne Cookie.
  2. Der Server erzeugt ein Sitzungsobjekt (Session-Objekt).
  3. Der Server sendet die Antwort mit einem Cookie.

Nachfolgende Anfragen enthalten aufgrund des erzeugten Cookie-Objekts weniger Daten. Sie enthalten dazu die Session-ID.

kap138 

Abb. 13.8: Cookie-Mechanismus

Im Folgenden wird der Einsatz von Cookies anhand eines Beispiels verdeutlicht. Im ersten Schritt wird ein Cookie-Objekt mit dem Namen DasCookie und mit dem Wert MeineID erzeugt. Dafür wird folgender Code benötigt:

code 

Cookie meinCookie = new Cookie("DasCookie", MeineID);

Cookie-Attribute können anschließend eingefügt werden, bspw. ein Kommentar zum Cookie-Objekt bzw. das Setzen der Versionsnummer.

code 

meinCookie.setComment("Dies ist ein Beispiel");
meinCookie.setVersion(1);

Das Senden des Cookie-Objekts an den Client erfolgt durch das Anhängen dieses Objekts an die Antwort.

code 

response.addCookie(getBook);

Die Variable response stellt hier die Antwort des Servlets dar. Ein Cookie-Objekt kann mit Hilfe der getCookies()-Methode gelesen werden. Da im Voraus nicht bekannt ist, wie viele Cookies die Anfrage beinhaltet, muss hier ein Array verwendet werden.

code 

Cookie[] cookies = request.getCookies();

Werte von Cookies werden mit Hilfe der Methoden der Klasse Cookie gelesen. Das oben erzeugte Cookie-Objekt wird zunächst gesucht und gelöscht. Das Löschen eines Cookies erfolgt durch das Setzen seiner maximalen Lebensdauer auf den Wert 0.

code 

for(i=0; i < cookies.length; i++) {

    Cookie thisCookie = cookie[i];
    if (thisCookie.getName().equals("DasCookie") && thisCookie.getValue().equals(MeineID)) {

      // Loesche das Cookie-Objekt
      thisCookie.setMaxAge(0);

    }

}


SPNavRight SPNavRight SPNavRight
BuiltByNOF