Umgang mit Cookies und einer Session in einem Java Servlet

Behandlung von Cookies und einer Sitzung in einem Java-Servlet

1. Überblick

In diesem Tutorial behandeln wirthe handling of cookies and sessions in Java, using Servlets.

Darüber hinaus werden wir kurz beschreiben, was ein Cookie ist, und einige Anwendungsbeispiele dafür untersuchen.

Einfach ausgedrückt,a cookie is a small piece of data stored on the client-side which servers use when communicating with clients.

They’re used to identify a client beim Senden einer nachfolgenden Anfrage. Sie können auch zum Übergeben einiger Daten von einem Servlet an ein anderes verwendet werden.

Weitere Informationen finden Sie unterto this article.

Die KlasseCookie ist im Paketjavax.servlet.http definiert.

Um es an den Client zu senden, müssen wircreate one and add it to the response:

Cookie uiColorCookie = new Cookie("color", "red");
response.addCookie(uiColorCookie);

Die API ist jedoch viel umfassender - lassen Sie uns sie untersuchen.

Wir können das maximale Alter (mit einer MethodemaxAge(int)) festlegen, das definiert, wie viele Sekunden ein bestimmtes Cookie gültig sein soll für:

uiColorCookie.setMaxAge(60*60);

Wir setzen ein Höchstalter von einer Stunde fest. Nach dieser Zeit kann der Cookie nicht mehr von einem Client (Browser) beim Senden einer Anfrage verwendet werden und sollte auch aus dem Browser-Cache entfernt werden.

Eine weitere nützliche Methode in derCookie-API istsetDomain(String).

Auf diese Weise können wir Domainnamen angeben, an die sie vom Kunden zugestellt werden sollen. Es hängt auch davon ab, ob wir den Domainnamen explizit angeben oder nicht.

Legen wir die Domain für ein Cookie fest:

uiColorCookie.setDomain("example.com");

Das Cookie wird an jede Anfrage vonexample.com und seinen Subdomains gesendet.

If we don’t specify a domain explicitly, it will be set to the domain namewhich created a cookie.

Wenn wir beispielsweise ein Cookie ausexample.com erstellen und den Domainnamen leer lassen, wird es anwww.example.com (ohne Subdomains) gesendet.

Neben einem Domainnamen können wir auch einen Pfad angeben. Schauen wir uns das als nächstes an.

Der Pfad gibt an, wohin ein Cookie gesendet wird.

Wenn wir einen Pfad explizit angeben, wird einCookie an die angegebene URL und alle ihre Unterverzeichnisse gesendet:

uiColorCookie.setPath("/welcomeUser");

Implizit wird es auf die URL gesetzt, die ein Cookie und alle seine Unterverzeichnisse erstellt hat.

Konzentrieren wir uns nun darauf, wie wir ihre Werte innerhalb vonServlet abrufen können.

2.5. Lesen Sie Cookies im Servlet

Der Anfrage des Kunden werden Cookies hinzugefügt. Der Client überprüft seine Parameter und entscheidet, ob er sie an die aktuelle URL liefern kann.

Wir können alle Cookies erhalten, indem wirgetCookies() auf die Anfrage (HttpServletRequest) aufrufen, die anServlet übergeben wird.

Wir können dieses Array durchlaufen und nach demjenigen suchen, den wir benötigen, z. B. indem wir deren Namen vergleichen:

public Optional readCookie(String key) {
    return Arrays.stream(request.getCookies())
      .filter(c -> key.equals(c.getName()))
      .map(Cookie::getValue)
      .findAny();
}

Toremove a cookie from a browser, we have to add a new one to the response with the same name, but with a maxAge value set to 0:

Cookie userNameCookieRemove = new Cookie("userName", "");
userNameCookieRemove.setMaxAge(0);
response.addCookie(userNameCookieRemove);

Ein beispielhafter Anwendungsfall zum Entfernen von Cookies ist eine Benutzer-Abmeldeaktion. Möglicherweise müssen einige Daten entfernt werden, die für eine aktive Benutzersitzung gespeichert wurden.

Jetzt wissen wir, wie wir mit Cookies innerhalb vonServlet umgehen können.

Als nächstes werden wir ein weiteres wichtiges Objekt behandeln, auf das wir sehr oft von einemServlet aus zugreifen - einemSession-Objekt.

3. HttpSession Objekt

DasHttpSession ist eine weitere Option zum Speichern benutzerbezogener Daten über verschiedene Anforderungen hinweg. Eine Sitzung ist ein serverseitiger Speicher, der Kontextdaten enthält.

Daten werden nicht zwischen verschiedenen Sitzungsobjekten geteilt (der Client kann nur von seiner Sitzung aus auf Daten zugreifen). Es enthält auch Schlüssel-Wert-Paare, aber im Vergleich zu einem Cookie kann eine Sitzung ein Objekt als Wert enthalten. Der Speicherimplementierungsmechanismus ist serverabhängig.

Eine Sitzung wird durch ein Cookie oder Anforderungsparameter mit einem Client abgeglichen. Weitere Informationen finden Sie unterhere.

3.1. Eine Sitzung bekommen

Wir können einHttpSession direkt aus einer Anfrage erhalten:

HttpSession session = request.getSession();

Mit dem obigen Code wird eine neue Sitzung erstellt, falls sie nicht vorhanden ist. Wir können dasselbe erreichen, indem wir anrufen:

request.getSession(true)

Wenn wir nur eine vorhandene Sitzung erhalten und keine neue erstellen möchten, müssen wir Folgendes verwenden:

request.getSession(false)

Wenn wir zum ersten Mal auf die JSP-Seite zugreifen, wird standardmäßig eine neue Sitzung erstellt. Wir können dieses Verhalten deaktivieren, indem wir das Attributsession auffalse: setzen

<%@ page contentType="text/html;charset=UTF-8" session="false" %>

In den meisten Fällen verwendet ein Webserver Cookies für die Sitzungsverwaltung. Wenn ein Sitzungsobjekt erstellt wird, erstellt ein Server ein Cookie mit dem Schlüssel und dem Wert vonJSESSIONID, das eine Sitzung identifiziert.

3.2. Session Attribute

Das Sitzungsobjekt bietet eine Reihe von Methoden für den Zugriff auf Attribute (Erstellen, Lesen, Ändern, Entfernen), die für eine bestimmte Benutzersitzung erstellt wurden:

  • setAttribute(String, Object), das ein Sitzungsattribut erstellt oder durch einen Schlüssel und einen neuen Wert ersetzt

  • getAttribute(String), das einen Attributwert mit einem bestimmten Namen (Schlüssel) liest

  • removeAttribute(String), wodurch ein Attribut mit einem bestimmten Namen entfernt wird

Wir können bereits vorhandene Sitzungsattribute auch einfach überprüfen, indem wirgetAttributeNames() aufrufen.

Wie bereits erwähnt, konnten wir ein Sitzungsobjekt aus einer Anforderung abrufen. Wenn wir es bereits haben, können wir die oben genannten Methoden schnell durchführen.

Wir können ein Attribut erstellen:

HttpSession session = request.getSession();
session.setAttribute("attributeKey", "Sample Value");

Der Attributwert kann über seinen Schlüssel (Name) erhalten werden:

session.getAttribute("attributeKey");

Wir können ein Attribut entfernen, wenn wir es nicht mehr benötigen:

session.removeAttribute("attributeKey");

Ein bekannter Anwendungsfall für eine Benutzersitzung ist das Ungültigmachen der gesamten gespeicherten Daten, wenn sich ein Benutzer von unserer Website abmeldet. Das Sitzungsobjekt bietet eine Lösung dafür:

session.invalidate();

Diese Methode entfernt die gesamte Sitzung vom Webserver, sodass wir nicht mehr auf Attribute zugreifen können.

Das Objekt vonHttpSessionverfügt über mehr Methoden, aber die von uns erwähnte ist die häufigste.

4. Fazit

In diesem Artikel haben wir zwei Mechanismen behandelt, mit denen wir Benutzerdaten zwischen nachfolgenden Anforderungen an den Server speichern können - das Cookie und die Sitzung.

Beachten Sie, dass das HTTP-Protokoll statusfrei ist. Daher ist es ein Muss, den Status für alle Anforderungen beizubehalten.

Wie immer sind Codefragmenteover on Github verfügbar.