[JAVA] Einführung in Ratpack (8) -Session

Ratpack Einführungsserie

  1. Einführung in Ratpack (1) - Was ist Ratpack
  2. Einführung in Ratpack (2) --Architecture
  3. Einführung in Ratpack (3) - Hallo Welt, ausführliche Erklärung
  4. Einführung in Ratpack (4) - Routing & statischer Inhalt
  5. Einführung in Ratpack (5) --Json & Registry
  6. Einführung in Ratpack (6) --Promise
  7. Einführung in Ratpack (7) - Guice & Spring
  8. Einführung in Ratpack (8) - Sitzung
  9. Einführung in Ratpack (9) - Thymeleaf

Session

Ratpack bietet standardmäßig keine Sitzungen an. Um die sogenannte Sticky-Sitzung nutzen zu können, benötigen Sie das Modul ratpack-session. Sie benötigen außerdem das Modul "ratpack-session-redis", um die Sitzungsunterstützung mit Redis zu aktivieren.

build.gradle


dependencies {
    compile "io.ratpack:ratpack-session:1.5.1"
}

Sie müssen das Modul registrieren. Wie oben erwähnt, bietet Ratpack Erweiterungsmodule als Guice-Module an.

Function<Registry, Registry> registry = ratpack.guice.Guice.registry( bindings -> {
    bindings.module( SessionModule.class );
} );

Rufen Sie die "Session" -Klasse, die die Sitzung verwaltet, aus "Registry" ab und bearbeiten Sie die Daten der Sitzung. Der "Kontext" des Handlers erbt von der "Registrierung", sodass Sie die Sitzung durch Aufrufen der Methode "Context.get ()" abrufen können.

Session session = context.get( Session.class );

Der Sitzungsschlüssel kann ein String oder die Klasse selbst sein. Für den String-Schlüssel ist jedoch eine Umwandlung erforderlich, um die Daten abzurufen. Wenn Sie eine Klasse verwenden, können Sie nicht dieselbe Klasse registrieren. Der beste Weg ist die Verwendung der SessionKey -Klasse.

public static final SessionKey<String> KEY = SessionKey.of( "KEY_NAME", String.class );

Sie können Daten sicher austauschen, indem Sie den Schlüsselnamen und den Schlüsseltyp angeben.

Verwenden Sie "get (SessionKey)" und "set (SessionKey , T)", um die Daten abzurufen bzw. festzulegen. ** Diese Operationen werden als Blockierungsoperationen behandelt **. Daher geben diese Methoden "Versprechen" und "Operation" zurück, anstatt Werte direkt zurückzugeben. Dies liegt daran, dass die Speicherung von Sitzungsinformationen von der Implementierung abhängt und davon ausgegangen wird, dass sie in KVS usw. außerhalb des Servers und nicht innerhalb des Servers gespeichert werden.

Im Folgenden finden Sie ein Beispiel zum Speichern der Anzahl und Zeit der Benutzerbesuche auf der Website.

Session session = ctx.get( Session.class );

session.get( countKey ).flatRight( v -> session.get( lastVisit ) ).then( pair -> {

    int count = pair.left.orElse( 0 );

    String response = count == 0
                      ? "This is the first visit."
                      : "You have visited " + count + " times.\n" +
                        "Last visit: " + pair.right.get().format( DateTimeFormatter.ISO_LOCAL_DATE_TIME );

    session.set( countKey, count + 1 )
           .next( session.set( lastVisit, LocalDateTime.now() ) )
           .then( () -> {
               ctx.render( response );
           } );
} );

Der von "get ()" zurückgegebene Typ ist "Promise <Optional >". Da es in "Optional" eingeschlossen ist, muss nicht wie bei Servlet nach Null gesucht werden. Wie Sie sehen können, überlappen sich die Versprechen, wenn Sie versuchen, mehrere Werte zu erhalten, und der Code wird schmutzig. Sie können die Werte in großen Mengen mit der Methode "getData ()" abrufen. Zusätzlich werden die gespeicherten Daten durch die Serialisierungsfunktion von Java serialisiert. Daher müssen Sie "Serializable" implementieren. Die Serialisierung erfolgt durch "SessionSerializer". Sie können die Serialisierungsmethode ändern, indem Sie Ihre eigene Implementierung für "Registrierung" bereitstellen.

ClientSideSessionModule

Die Standardimplementierung von ratpack-session verwendet einen speicherinternen Cache, der den Cache von Guava nutzt. Andererseits gibt es bei Verwendung von "ClientSideSessionModule" auch ein Modul, das eine clientseitige Sitzung verwendet, die Daten in einem Cookie verschlüsselt und speichert.

Standardmäßig sind die Informationen nicht verschlüsselt. Sie müssen immer den Schlüssel angeben.

ratpack-session-redis

Das Modul ratpack-session-redis dient zum Speichern von Sitzungsinformationen in Redis.

build.gradle


dependencies {
    compile "io.ratpack:ratpack-session-redis:1.5.1"
}

Stellen Sie das Modul ein.

RedisSessionModule redisModule = new RedisSessionModule();
redisModule.configure( config -> {
    config.setHost( "localhost" );
    config.setPort( 6379 );
    config.setPassword( null );
} );

Function<Registry, Registry> registry = ratpack.guice.Guice.registry( bindings -> {
    bindings.module( SessionModule.class );
    bindings.module( redisModule );
} );

Das RedisSessionModule muss ** nach ** dem SessionModule registriert werden. Ratpack gibt später registrierten Klassen Vorrang. Wenn Sie die Reihenfolge umkehren, wird die Implementierung "Sitzung" für die Sticky-Sitzung anstelle von Redis ausgeführt. Hier werden der Host und der Port programmgesteuert festgelegt, aber Sie können sie über "ConfigSource" festlegen.

Die Verwendung selbst ist die gleiche wie bei einer normalen Ratpack-Sitzung. Einmal eingestellt, werden Sie nicht wissen, dass das Backend Redis ist.

Daten werden auf dem Redis-Server unter Verwendung der Sitzungs-ID als Schlüssel gespeichert. Standardmäßig wird die UUID als Sitzungs-ID verwendet. Die ID-Generierung erfolgt über SessionIdGenerator und Sie können Implementierungen von Registry wechseln.

キャプチャ2.png

# redis-cli
127.0.0.1:6379> keys *
1) "036f9723-3df8-e018-9abe-2db2bca5f6f6"
127.0.0.1:6379> get 036f9723-3df8-e018-9abe-2db2bca5f6f6
"\xac\xed\x00\x05sr\x006ratpack.session.internal.DefaultSession$SerializedForm\x00\x00\x00\x00\x00\x00\x00\x02\x0c\x00\x00xpw\xd3\x00\x01\x00\x02\x01\x00\x05COUNT\x01\x00\x11java.lang.Integer\x00\x00\x00
Q\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\x02\x01\x00\nLAST_V
ISIT\x01\x00\x17java.time.LocalDateTime\x00\x00\x003\xac\xed\x00\x05sr\x00\rjava.time.Ser\x95]\x84\xba\x1b\"H\xb2\x0c\x00\x00xpw\x0e\x05\x00\x00\a\xe2\x02\t\r8!\x1a\xe1\xb6\xc0xx"
127.0.0.1:6379>

Übrigens benutze ich Kopfsalat, um mit Redis zu kommunizieren (immer mit Kohl verwechselt).

Recommended Posts

Einführung in Ratpack (8) -Session
Einführung in Ratpack (6) --Promise
Einführung in Ratpack (9) - Thymeleaf
Einführung in Ratpack (2) -Architektur
Einführung in Ratpack (5) --Json & Registry
Einführung in Ratpack (7) - Guice & Spring
Einführung in Ratpack (1) - Was ist Ratpack?
Einführung in Ruby 2
Einführung in web3j
Einführung in Micronaut 1 ~ Einführung ~
[Java] Einführung in Java
Einführung in die Migration
Einführung in Java
Einführung in Doma
Einführung in Ratpack (Extra Edition) - Mit Sentry
Einführung in Ratpack (3) - Hallo Welt, detaillierte Erklärung
Einführung in Ratpack (Extra Edition) - Ratpack in Kotlin geschrieben
Einführung in JAR-Dateien
Einführung in die Bitarithmetik
Einführung in PlayFramework 2.7 ① Übersicht
Einführung in das Android-Layout
Einführung in Entwurfsmuster (Einführung)
Einführung in die praktische Programmierung
Einführung in den Befehl javadoc
Einführung in den Befehl jar
Einführung in den Lambda-Stil
Einführung in den Java-Befehl
Einführung in die Keycloak-Entwicklung
Einführung in den Befehl javac
Einführung in die Android App-Entwicklung
Einführung in Metabase ~ Umgebungskonstruktion ~
(Punktinstallation) Einführung in Java8_Impression
Einführung in Entwurfsmuster (Composite)
Einführung in Micronaut 2 ~ Unit Test ~
Einführung in JUnit (Studiennotiz)
Einführung in Spring Boot ~ ~ DI ~
Einführung in Designmuster (Fliegengewicht)
[Java] Einführung in den Lambda-Ausdruck
Einführung in Spring Boot ② ~ AOP ~
Einführung in Apache Beam (2) ~ ParDo ~
Einführung in die EHRbase 2-REST-API
Einführung in Entwurfsmuster Prototyp
[Java] Einführung in die Stream-API
Einführung in Entwurfsmuster (Iterator)
Einführung in Spring Boot Teil 1
Einführung in Entwurfsmuster (Strategie)
[Einführung in Janken (ähnliche) Spiele] Java
Einführung in Linux Container / Docker (Teil 1)
Einführung in die schnelle Übungsausgabe Kapitel 5
[Einführung in Java] Über Lambda-Ausdrücke
Einführung in Algorithmen mit Java-kumulativer Summe