Ejercicio: Almacenamiento de datos de sesión HTTP en Redis

Completado

En esta unidad agregará Spring Session a la aplicación de Spring Boot para almacenar datos de sesión HTTP en Azure Cache for Redis.

Configuración de Spring Session

  1. Para agregar compatibilidad con Spring Session a la aplicación, agregue la siguiente dependencia en la sección <dependencies> del archivo pom.xml:

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    
  2. Para configurar Spring Session con el fin de usar Redis para la replicación de sesiones, agregue la siguiente línea al archivo src/main/resources/application.properties:

    spring.session.store-type=redis
    

Adición de un controlador nuevo para probar la replicación de sesiones

Agregue un nuevo controlador REST para Spring MVC a la aplicación con el fin de usarlo para probar la replicación de sesiones.

  1. Cree un nuevo controlador denominado SessionReplicationController junto a TodoController.

    package com.example.demo;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.session.data.redis.config.ConfigureRedisAction;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.servlet.http.HttpSession;
    
    @RestController
    @RequestMapping("/")
    public class SessionReplicationController {
    
        @Bean
        public static ConfigureRedisAction configureRedisAction() {
            return ConfigureRedisAction.NO_OP;
        }
    
        @GetMapping("/session")
        public String session(HttpSession session) {
            Integer test = (Integer) session.getAttribute("test");
            if (test == null) {
                test = 0;
            } else {
                test++;
            }
            session.setAttribute("test", test);
            return "[" + session.getId() + "]-" + test;
        }
    }
    

    Nota

    Configure un bean de Spring ConfigureRedisAction.NO_OP específico, porque, de forma predeterminada, Spring Session intenta configurar las notificaciones de espacio de claves de Redis, que no funcionarán en instancias de Azure Cache for Redis protegidas. Si necesita notificaciones de espacio de claves para Azure Cache for Redis, debe aplicarlas manualmente a través de la CLI de Redis.

    Las notificaciones de espacio de claves son útiles para WebSockets, pero consumen más recursos. En el escenario actual no se usa WebSockets y no deben habilitarse las notificaciones de espacio de claves.

  2. Reinicie la aplicación para beneficiarse de la replicación de sesiones HTTP.

Prueba de la replicación de sesiones

Las sesiones HTTP son específicas del usuario y se mantienen por medio de una cookie. Puede usar cualquiera de los siguientes métodos para probar si las sesiones funcionan correctamente:

  • Ponga la dirección http://localhost:8080/session en el explorador y recargue la página varias veces.

  • Ejecute la siguiente línea de comandos varias veces:

    curl -b cookie.txt -c cookie.txt http://127.0.0.1:8080/session
    

    El comando anterior guarda la cookie en un archivo denominado cookie.txt.

Cualquier método produce una salida que muestra el id. de sesión HTTP con un número que se incrementa después de cada solicitud, como se muestra en el siguiente ejemplo:

Screenshot that shows example output for session replication.

Para comprobar si las sesiones se conservan correctamente, reinicie el servidor y compruebe que no se han perdido los datos de las sesiones.

En la siguiente unidad implementará la aplicación en la nube y agrupará en clúster las sesiones HTTP entre la máquina local y el servicio en la nube.