Ratpack ne fournit pas de sessions par défaut. Pour utiliser la soi-disant session Sticky, vous avez besoin du module ratpack-session
. Vous avez également besoin du module ratpack-session-redis
pour activer le support de session avec Redis.
build.gradle
dependencies {
compile "io.ratpack:ratpack-session:1.5.1"
}
Vous devez enregistrer le module. Comme mentionné ci-dessus, Ratpack fournit des modules d'extension sous forme de modules Guice.
Function<Registry, Registry> registry = ratpack.guice.Guice.registry( bindings -> {
bindings.module( SessionModule.class );
} );
Récupérez la classe Session
qui gère la session depuis Registry
et manipulez les données de la session. Le Context
du gestionnaire hérite du Registry
, vous pouvez donc obtenir la session en appelant la méthode Context.get ()
.
Session session = context.get( Session.class );
La clé de session peut être une chaîne ou la classe elle-même. Cependant, la clé String nécessite un cast pour récupérer les données et si vous utilisez une classe, vous ne pourrez pas enregistrer la même classe. Le meilleur moyen est d'utiliser la classe SessionKey <T>
.
public static final SessionKey<String> KEY = SessionKey.of( "KEY_NAME", String.class );
En spécifiant le nom et le type de la clé, vous pouvez échanger des données en toute sécurité.
Utilisez get (SessionKey)
et set (SessionKey <T>, T)
pour obtenir et définir les données, respectivement. ** Ces opérations sont traitées comme des opérations de blocage **. Par conséquent, ces méthodes renvoient «Promise» et «Opération» au lieu de renvoyer directement des valeurs. En effet, la manière dont les informations de session sont stockées dépend de l'implémentation et il est supposé qu'elles seront stockées dans un KVS externe, etc.
Vous trouverez ci-dessous un exemple d'enregistrement du nombre et de l'heure des visites des utilisateurs sur le site.
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 );
} );
} );
Le type renvoyé par get ()
est Promise <Optional <T >>
. Comme il s'enroule dans ʻOptional, il n'est pas nécessaire de vérifier la valeur null comme Servlet. Comme vous pouvez le voir, lorsque vous essayez d'obtenir plusieurs valeurs, les
promessesse chevauchent et le code se salit. Vous pouvez obtenir les valeurs en bloc avec la méthode
getData (). De plus, les données stockées sont sérialisées par la fonction de sérialisation de Java. Par conséquent, vous devez implémenter
Serializable. La sérialisation est effectuée par
SessionSerializer. Vous pouvez changer la méthode de sérialisation en fournissant votre propre implémentation pour
Registry`.
ClientSideSessionModule
L'implémentation par défaut de ratpack-session utilise un cache en mémoire qui exploite le cache de Guava. D'autre part, il existe également un module qui utilise une session côté client qui crypte les données dans un cookie et stocke les données en utilisant ClientSideSessionModule
.
Par défaut, les informations ne sont pas cryptées. Vous devez toujours spécifier la clé.
ratpack-session-redis
Le module ratpack-session-redis est fourni pour stocker les informations de session dans Redis.
build.gradle
dependencies {
compile "io.ratpack:ratpack-session-redis:1.5.1"
}
Réglez le module.
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 );
} );
Le RedisSessionModule
doit être enregistré ** après ** du SessionModule
. Ratpack donne la priorité aux classes enregistrées plus tard. Si vous inversez l'ordre, l'implémentation Session
sera pour la session Sticky au lieu de Redis.
Ici, l'hôte et le port sont définis par programme, mais vous pouvez les définir à partir de ConfigSource
.
L'utilisation elle-même est la même que celle d'une session ratpack normale. Une fois défini, vous ne saurez pas que le backend est Redis.
Les données sont stockées sur le serveur Redis en utilisant l'ID de session comme clé. UUID est utilisé comme ID de session par défaut. La génération d'ID se fait via SessionIdGenerator
et vous pouvez changer d'implémentation depuis Registry
.
# 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>
Au fait, j'utilise Lettuce pour communiquer avec Redis (toujours confondu avec du chou).
Recommended Posts