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