[JAVA] Introduction à Ratpack (8) - Session

Série d'introduction Ratpack

  1. Introduction à Ratpack (1) - Qu'est-ce que Ratpack
  2. Introduction à Ratpack (2) --Architecture
  3. Introduction à Ratpack (3) - Explication détaillée de Hello world
  4. Introduction à Ratpack (4) --Routage et contenu statique
  5. Introduction à Ratpack (5) --Json & Registry
  6. Introduction à Ratpack (6) - Promise
  7. Introduction à Ratpack (7) --Guice & Spring
  8. Introduction à Ratpack (8) - Session
  9. Introduction à Ratpack (9) --Thymeleaf

session

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éthodegetData (). 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.

キャプチャ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>

Au fait, j'utilise Lettuce pour communiquer avec Redis (toujours confondu avec du chou).

Recommended Posts

Introduction à Ratpack (8) - Session
Introduction à Ratpack (6) - Promesse
Introduction à Ratpack (9) --Thymeleaf
Introduction à Ratpack (2) -Architecture
Introduction à Ratpack (5) --Json & Registry
Introduction à Ratpack (7) --Guice & Spring
Introduction à Ratpack (1) - Qu'est-ce que Ratpack?
Introduction à Ruby 2
Introduction à web3j
Introduction à Micronaut 1 ~ Introduction ~
[Java] Introduction à Java
Introduction à la migration
Introduction à Java
Introduction à Doma
Introduction à Ratpack (Extra Edition) - Utilisation de Sentry
Introduction à Ratpack (3) - Explication détaillée de Hello World
Introduction à Ratpack (Extra Edition) --Ratpack écrit en Kotlin
Introduction aux fichiers JAR
Introduction à l'arithmétique des bits
Introduction à PlayFramework 2.7 ① Présentation
Introduction à la mise en page Android
Introduction aux modèles de conception (introduction)
Introduction à la programmation pratique
Introduction à la commande javadoc
Introduction à la commande jar
Introduction au style lambda
Introduction à la commande java
Introduction au développement de Keycloak
Introduction à la commande javac
Introduction au développement d'applications Android
Introduction à la métabase ~ Construction de l'environnement ~
(Installation par points) Introduction à Java8_Impression
Introduction aux modèles de conception (composite)
Introduction à Micronaut 2 ~ Test unitaire ~
Introduction à JUnit (note d'étude)
Introduction à Spring Boot ① ~ DI ~
Introduction aux modèles de conception (poids mouche)
[Java] Introduction à l'expression lambda
Introduction à Spring Boot ② ~ AOP ~
Introduction à Apache Beam (2) ~ ParDo ~
Introduction à l'API EHRbase 2-REST
Introduction au prototype de modèles de conception
[Java] Introduction à l'API Stream
Introduction aux modèles de conception (Iterator)
Introduction à Spring Boot, partie 1
Introduction aux modèles de conception (stratégie)
[Introduction aux jeux Janken (comme)] Java
Introduction à Linux Container / Docker (Partie 1)
Introduction à la pratique rapide Chapitre 5
[Introduction à Java] À propos des expressions lambda
Introduction aux algorithmes avec somme cumulée Java