Esercizio - Archiviare i dati delle sessioni HTTP in Redis

Completato

In questa unità, si aggiungerà Spring Session all'applicazione Spring Boot esistente per archiviare i dati delle sessioni HTTP nella cache di Azure per Redis.

Configurare Spring Session

  1. Per aggiungere il supporto Spring Session all'applicazione, aggiungere la dipendenza seguente nella sezione <dependencies> del file pom.xml:

    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    
  2. Per configurare Spring Session in modo che utilizzi Redis per la replica delle sessioni, aggiungere la seguente riga al file src/main/resources/application.properties:

    spring.session.store-type=redis
    

Aggiungere un nuovo controller per testare la replica delle sessioni

Aggiungere un nuovo controller Spring MVC REST all'applicazione da usare per il test della replica di sessione.

  1. Creare un nuovo controllere denominato SessionReplicationController accanto 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

    È possibile configurare un bean Spring specifico ConfigureRedisAction.NO_OP perché, per impostazione predefinita, Spring Session tenta di configurare le notifiche keyspace Redis, che non funzioneranno nelle istanze protette di cache di Azure per Redis. Se sono necessarie notifiche keyspace per la cache di Azure per Redis, è necessario applicarle manualmente tramite l'interfaccia della riga di comando di Redis.

    Le notifiche keyspace sono utili per WebSocket, ma utilizzano più risorse. Lo scenario corrente non usa WebSocket e non deve abilitare le notifiche keyspace.

  2. Riavviare l'applicazione per trarre vantaggio dalla replica di sessione HTTP.

Testare la replica della sessione

Le sessioni HTTP sono specifiche dell'utente e vengono gestite tramite un cookie. È possibile usare uno dei metodi seguenti per verificare se le sessioni funzionano correttamente:

  • Puntare il browser a http://localhost:8080/session e ricaricare la pagina più volte.

  • Eseguire la riga di comando seguente più volte:

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

    Il comando precedente salva il cookie in un file denominato cookie.txt.

Entrambi i metodi producono output che visualizza l'ID sessione HTTP con un numero che incrementa dopo ogni richiesta, come illustrato nell'esempio seguente:

Screenshot that shows example output for session replication.

Per controllare se le sessioni vengono correttamente salvate in modo permanente, riavviare il server e verificare che i dati della sessione non siano andati perduti.

Nell'unità successiva, l'applicazione viene distribuita nel cloud e le sessioni HTTP del cluster tra il computer locale e il servizio cloud.