Wir werden weiterhin über WebFlux sprechen. Dieses Mal werde ich die Verwendung von Session in WebFlux vorstellen. Darüber hinaus finden Sie hier ein Beispiel für eine In-Memory-Implementierung, bei der Redis nicht verwendet wird. Dies ist die Mindestkonfiguration.
Im Fall von Maven [Grundlegende Build-Konfiguration](https://qiita.com/kilvis/items/fb18be963da6cac03ee9#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7 Fügen Sie die folgende Abhängigkeit zu% E3% 82% AF% E3% 83% 88% E3% 81% AE% E4% BD% 9C% E6% 88% 90 hinzu.
pom.xml
~ Ausgelassen ~
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
Informationen zu Gradle finden Sie in den folgenden Abhängigkeiten.
build.gradle
~ Ausgelassen ~
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.session:spring-session-core'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
Stellen Sie zunächst den DI des Sitzungsrepositorys so ein, dass die Sitzung mit WebFlux verwendet wird.
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;
}
}
Es gibt 3 Punkte in den Kommentaren
@ EnableSpringWebSession
hinzufügenSehen wir uns ein Beispiel für die Implementierung eines einfachen Zählers mithilfe einer Sitzung an.
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;
});
}
}
Verwenden Sie "WebSession", um mit WebFlux auf die Sitzung zuzugreifen. Eine Feldinjektion wie "HttpSession" von Servlet kann jedoch nicht durchgeführt werden, daher ist die Implementierung wie folgt.
Mit der obigen Implementierung
localhost:8080/count/1
Sie können den Vorgang des Aufzählens bei jedem Zugriff um 1 überprüfen.
Wenn 10 Minuten lang kein Zugriff besteht, wird der Anfangswert 0 wiederhergestellt.
Wenn Sie den Wert der Sitzung verwenden möchten, müssen Sie die WebSession in Controller abrufen und den Wert an die nachfolgende Verarbeitung (Service usw.) übergeben.
Sie müssen beim Entwerfen der Komponente, die die Sitzung behandelt, vorsichtig sein, da Sie sie nicht so verwenden können.
(Erstens hängen SessionScope und RequestScope von ThreadLocal ab, sodass es unvermeidlich sein kann, dass WebFlux nicht auf die gleiche Weise damit umgehen kann ^^;)
https://docs.spring.io/spring-session/docs/current/reference/html5/#websession → Offiziell wird auch aufgeführt, wie Redis und WebSession verknüpft werden.
Recommended Posts