Behandeln von Cookies und einer Sitzung in einem Java-Servlet

1. Übersicht

In diesem Tutorial behandeln wir den Umgang mit Cookies und Sitzungen in Java mithilfe von Servlets .

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

2. Cookie-Grundlagen

Einfach ausgedrückt ist ein Cookie ein kleines Datenelement, das auf der Clientseite gespeichert wird und das Server für die Kommunikation mit Clients verwenden .

Sie werden verwendet, um einen Client zu identifizieren, wenn eine nachfolgende Anfrage gesendet wird. Sie können auch zum Übergeben einiger Daten von einem Servlet an ein anderes verwendet werden.

Weitere Informationen finden Sie in diesem Artikel.

2.1. Erstellen Sie ein Cookie

Die Cookie- Klasse ist im Paket javax.servlet.http definiert .

Um es an den Client zu senden, müssen wir eines erstellen und zur Antwort hinzufügen :

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

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

2.2. Legen Sie das Ablaufdatum des Cookies fest

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

uiColorCookie.setMaxAge(60*60); 

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

2.3. Legen Sie die Cookie-Domain fest

Eine weitere nützliche Methode in der Cookie- API ist setDomain (String) .

Auf diese Weise können wir Domänennamen angeben, an die sie vom Client übermittelt 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 von example.com und seinen Subdomains gesendet.

Wenn wir eine Domain nicht explizit angeben, wird sie auf den Domainnamen gesetzt, der ein Cookie erstellt hat .

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

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

2.4. Legen Sie den Cookie-Pfad fest

Der Pfad gibt an, wohin ein Cookie gesendet wird.

Wenn wir einen Pfad explizit angeben, wird ein Cookie 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 in einem Servlet abrufen können .

2.5. Lesen Sie Cookies im Servlet

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

Wir können alle Cookies erhalten, indem wir getCookies () auf die an das Servlet übergebene Anfrage ( HttpServletRequest ) aufrufen .

Wir können dieses Array durchlaufen und nach dem Array suchen, das wir benötigen, z. B. indem wir ihre Namen vergleichen:

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

2.6. Entfernen Sie ein Cookie

Um ein Cookie aus einem Browser zu entfernen, müssen wir der Antwort mit demselben Namen, jedoch mit einem auf 0 gesetzten maxAge- Wert , ein neues hinzufügen :

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

Ein Beispiel für einen Anwendungsfall zum Entfernen von Cookies ist eine Benutzerabmeldeaktion. Möglicherweise müssen einige Daten entfernt werden, die für eine aktive Benutzersitzung gespeichert wurden.

Jetzt wissen wir, wie wir mit Cookies in einem Servlet umgehen können .

Als nächstes werden wir ein anderes wichtiges Objekt behandeln, auf das wir sehr oft von einem Servlet aus zugreifen - ein Sitzungsobjekt .

3. HttpSession- Objekt

Die HttpSession 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 Infos finden Sie hier.

3.1. Eine Sitzung bekommen

Wir können eine HttpSession direkt aus einer Anfrage erhalten:

HttpSession session = request.getSession(); 

Der obige Code erstellt eine neue Sitzung, falls diese 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) 

If we access the JSP page for the first time, then a new session gets created by default. We can disable this behavior by setting the session attribute to false:

In most cases, a web server uses cookies for session management. When a session object is created, then a server creates a cookie with JSESSIONID key and value which identifies a session.

3.2. Session Attributes

The session object provides a bunch of methods for accessing (create, read, modify, remove) attributes created for a given user session:

  • setAttribute(String, Object) which creates or replaces a session attribute with a key and a new value
  • getAttribute(String) which reads an attribute value with a given name (key)
  • removeAttribute(String) which removes an attribute with a given name

We can also easily check already existing session attributes by calling getAttributeNames().

As we already mentioned, we could retrieve a session object from a request. When we already have it, we can quickly perform methods mentioned above.

We can create an attribute:

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

The attribute value can be obtained by its key (name):

session.getAttribute("attributeKey"); 

We can remove an attribute when we don't need it anymore:

session.removeAttribute("attributeKey"); 

A well-known use case for a user session is to invalidate whole data it stores when a user logs out from our website. The session object provides a solution for it:

session.invalidate(); 

This method removes the whole session from the web server so we cannot access attributes from it anymore.

Das HttpSession- Objekt verfü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 Benutzerdaten zwischen nachfolgenden Anforderungen an den Server gespeichert werden können - das Cookie und die Sitzung.

Beachten Sie, dass das HTTP-Protokoll zustandslos ist. Daher ist es ein Muss, den Status über Anforderungen hinweg aufrechtzuerhalten.

Wie immer sind Code-Schnipsel auf Github verfügbar.