[JAVA] Essayez d'implémenter une session WebFlux

Nous continuerons à parler de WebFlux. Cette fois, je vais vous présenter comment utiliser Session dans WebFlux. De plus, voici un exemple d'implémentation en mémoire qui n'utilise pas Redis, qui est la configuration minimale.

Exemple d'environnement

Configuration de la construction du projet

Dans le cas de Maven, [Configuration de construction de base](https://qiita.com/kilvis/items/fb18be963da6cac03ee9#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7 Ajoutez la dépendance suivante à% E3% 82% AF% E3% 83% 88% E3% 81% AE% E4% BD% 9C% E6% 88% 90).

pom.xml


~ Omis ~
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-core</artifactId>
</dependency>

Pour Gradle, reportez-vous aux dépendances suivantes.

build.gradle


~ Omis ~
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'org.springframework.session:spring-session-core'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

Paramètres d'utilisation de la session

Tout d'abord, définissez la DI du référentiel de session pour utiliser la session avec WebFlux.

InMemorySessionConfig.java


@Configuration
@EnableSpringWebSession    // 1
public class InMemorySessionConfig {

  @Bean
  public ReactiveSessionRepository reactiveSessionRepository() {

    ReactiveMapSessionRepository repository =
        new ReactiveMapSessionRepository(new ConcurrentHashMap<>());    // 2

    repository.setDefaultMaxInactiveInterval(60 * 30); // 3

    return repository;
  }

}

Il y a 3 points dans les commentaires

  1. Activez WebSession en ajoutant l'annotation @ EnableSpringWebSession
  2. Enregistrement Bean de ReactiveSessionRepository
  3. Spécifiez la date d'expiration de la session (secondes) (60 secondes * 10 = 10 minutes dans l'exemple)

Essayez d'utiliser la session

Jetons un œil à un exemple d'implémentation de compteur simple qui utilise réellement une session.

CountController.java



@RestController
public class CountController {

  @GetMapping("count/{increments}")
  public Mono<Integer> count(@PathVariable Integer increments, WebSession webSession) {    // 1
    return Mono.fromSupplier(
        () -> {
          Integer total =
              Optional.ofNullable((Integer) webSession.getAttribute("count"))
                  .map(current -> current + increments)
                  .orElse(0);    // 2
          webSession.getAttributes().put("count", total);    // 3
          return total;
        });
  }
}

Utilisez WebSession pour accéder à la session avec WebFlux. Cependant, l'injection de champ comme HttpSession de Servlet ne peut pas être effectuée, donc l'implémentation est la suivante.

  1. Spécifiez WebSession comme argument de méthode du point de terminaison
  2. Prenez le décompte actuel de la session, ajoutez des incréments s'il y en a un et définissez la valeur initiale 0 sur total si ce n'est pas le cas.
  3. Emballez le résultat total du calcul dans la session

Avec l'implémentation ci-dessus localhost:8080/count/1 Vous pouvez vérifier l'opération de comptage par 1 à chaque fois que vous accédez à. S'il n'y a pas d'accès pendant 10 minutes, il reviendra à la valeur initiale de 0.

C'est un peu difficile à utiliser ...

Si vous souhaitez utiliser la valeur de la session, vous devez récupérer la WebSession dans Controller et transmettre la valeur au traitement suivant (Service, etc.).

--Définissez les beans SessionScope comme l'implémentation du servlet, --DI HttpSession dans n'importe quel champ ou constructeur de composant,

Vous devez être prudent lors de la conception du composant qui gère la session, car vous ne pouvez pas l'utiliser comme ça.

(En premier lieu, SessionScope et RequestScope dépendent de ThreadLocal, il peut donc être inévitable que WebFlux ne puisse pas le gérer de la même manière ^ ^;)

référence

https://docs.spring.io/spring-session/docs/current/reference/html5/#websession → Officiellement, comment lier Redis et WebSession est également répertorié, veuillez donc vous y référer.

Recommended Posts

Essayez d'implémenter une session WebFlux
Essayez d'implémenter un filtre WebFlux
Essayez d'envoyer une notification.
Essayez d'implémenter Yuma dans Kinx
Essayez le tutoriel Spring WebFlux
Essayez d'implémenter Android Hilt en Java
Essayez d'implémenter le traitement asynchrone dans Azure
Essayez d'implémenter recaptcha avec Jetty intégré.
Essayez Spring WebFlux (principalement les fonctions de routeur)
Essayez de créer une application client serveur
Essayez de créer un itérateur qui puisse être vu