Manejo de cookies y una sesión en un servlet Java

1. Información general

En este tutorial, cubriremos el manejo de cookies y sesiones en Java, usando Servlets .

Además, describiremos brevemente qué es una cookie y exploraremos algunos casos de uso de muestra para ella.

2. Conceptos básicos sobre cookies

En pocas palabras, una cookie es una pequeña parte de los datos almacenados en el lado del cliente que los servidores utilizan cuando se comunican con los clientes .

Se utilizan para identificar a un cliente al enviar una solicitud posterior. También se pueden utilizar para pasar algunos datos de un servlet a otro.

Para obtener más detalles, consulte este artículo.

2.1. Crear una cookie

La clase Cookie se define en el paquete javax.servlet.http .

Para enviarlo al cliente, necesitamos crear uno y agregarlo a la respuesta :

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

Sin embargo, su API es mucho más amplia, explorémosla.

2.2. Establecer la fecha de vencimiento de la cookie

Podemos establecer la edad máxima (con un método maxAge (int) ) que define cuántos segundos debe ser válida una cookie determinada:

uiColorCookie.setMaxAge(60*60); 

Establecimos una edad máxima en una hora. Después de este tiempo, un cliente (navegador) no puede usar la cookie al enviar una solicitud y también debe eliminarse de la caché del navegador.

2.3. Establecer el dominio de cookies

Otro método útil en la API de cookies es setDomain (String) .

Esto nos permite especificar nombres de dominio a los que debe ser entregado por el cliente. También depende de si especificamos el nombre de dominio explícitamente o no.

Configuremos el dominio para una cookie:

uiColorCookie.setDomain("example.com");

La cookie se enviará a cada solicitud realizada por example.com y sus subdominios.

Si no especificamos un dominio explícitamente, se configurará con el nombre de dominio que creó una cookie .

Por ejemplo, si creamos una cookie desde example.com y dejamos el nombre de dominio vacío, se enviará a www.example.com (sin subdominios).

Junto con un nombre de dominio, también podemos especificar una ruta. Echemos un vistazo a eso a continuación.

2.4. Establecer la ruta de las cookies

La ruta especifica dónde se entregará una cookie.

Si especificamos una ruta explícitamente, se enviará una cookie a la URL dada y a todos sus subdirectorios:

uiColorCookie.setPath("/welcomeUser");

Implícitamente, se establecerá en la URL que creó una cookie y todos sus subdirectorios.

Ahora centrémonos en cómo podemos recuperar sus valores dentro de un Servlet .

2.5. Leer cookies en el servlet

Las cookies se agregan a la solicitud por parte del cliente. El cliente verifica sus parámetros y decide si puede enviarlo a la URL actual.

Podemos obtener todas las cookies llamando a getCookies () en la solicitud ( HttpServletRequest ) pasada al Servlet .

Podemos iterar a través de esta matriz y buscar la que necesitamos, por ejemplo, comparando sus nombres:

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

2.6. Quitar una cookie

Para eliminar una cookie de un navegador, tenemos que agregar una nueva a la respuesta con el mismo nombre, pero con un valor de maxAge establecido en 0 :

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

Un ejemplo de caso de uso para eliminar cookies es una acción de cierre de sesión del usuario: es posible que necesitemos eliminar algunos datos que se almacenaron para una sesión de usuario activa.

Ahora sabemos cómo podemos manejar las cookies dentro de un servlet .

A continuación, cubriremos otro objeto importante al que accedemos muy a menudo desde un Servlet : un objeto Session .

3. Objeto HttpSession

El HttpSession es otra opción para almacenar datos relacionados con el usuario a través de diferentes peticiones. Una sesión es un almacenamiento del lado del servidor que contiene datos contextuales.

Los datos no se comparten entre diferentes objetos de sesión (el cliente solo puede acceder a los datos desde su sesión). También contiene pares clave-valor, pero en comparación con una cookie, una sesión puede contener un objeto como valor. El mecanismo de implementación de almacenamiento depende del servidor.

Una sesión se relaciona con un cliente mediante una cookie o parámetros de solicitud. Encuentra más información aquí.

3.1. Obtener una sesión

Podemos obtener una HttpSession directamente de una solicitud:

HttpSession session = request.getSession(); 

El código anterior creará una nueva sesión en caso de que no exista. Podemos lograr lo mismo llamando a:

request.getSession(true)

En caso de que solo queramos obtener una sesión existente y no crear una nueva, necesitamos usar:

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.

El objeto HttpSession tiene más métodos, pero los que mencionamos son los más comunes.

4. Conclusión

En este artículo, cubrimos dos mecanismos que nos permiten almacenar datos del usuario entre solicitudes posteriores al servidor: la cookie y la sesión.

Tenga en cuenta que el protocolo HTTP no tiene estado, por lo que es imprescindible mantener el estado en todas las solicitudes.

Como siempre, los fragmentos de código están disponibles en Github.