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.
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'
}
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
@ EnableSpringWebSession
ReactiveSessionRepository
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.
WebSession
comme argument de méthode du point de terminaisonAvec 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.
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 ^ ^;)
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