[JAVA] Versuchen Sie, eine WebFlux-Sitzung zu implementieren

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.

Beispielumgebung

Konfiguration der Projekterstellung

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'
}

Einstellungen für die Verwendung der Sitzung

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

  1. Aktivieren Sie WebSession, indem Sie die Annotation @ EnableSpringWebSession hinzufügen
  2. Bean-Registrierung von "ReactiveSessionRepository"
  3. Geben Sie das Ablaufdatum der Sitzung (Sekunden) an (60 Sekunden * 10 = 10 Minuten im Beispiel).

Versuchen Sie es mit der Sitzung

Sehen 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.

  1. Geben Sie "WebSession" als Methodenargument des Endpunkts an
  2. Nehmen Sie die aktuelle Anzahl aus der Sitzung, fügen Sie gegebenenfalls Inkremente hinzu und setzen Sie den Anfangswert 0 auf total, wenn nicht
  3. Packen Sie das gesamte Berechnungsergebnis in die Sitzung

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.

Es ist ein wenig schwierig zu bedienen ...

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 ^^;)

Referenz

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

Versuchen Sie, eine WebFlux-Sitzung zu implementieren
Versuchen Sie, einen WebFlux-Filter zu implementieren
Versuchen Sie, eine Benachrichtigung zu senden.
Versuchen Sie, Yuma in Kinx zu implementieren
Probieren Sie das Spring WebFlux-Tutorial aus
Versuchen Sie, Android Hilt in Java zu implementieren
Versuchen Sie, die asynchrone Verarbeitung in Azure zu implementieren
Versuchen Sie, recaptcha mit eingebettetem Jetty zu implementieren.
Probieren Sie Spring WebFlux aus (hauptsächlich Router-Funktionen).
Versuchen Sie, eine Server-Client-App zu erstellen
Versuchen Sie, einen Iterator zu erstellen, der einen Blick darauf werfen kann