[JAVA] Stocker les informations de session dans la base de données avec Spring Session

Qu'est-ce que la session de printemps?

Vous pouvez écraser la fonction de HttpSession et gérer les informations de session avec Redis ou RDBMS. Normalement, les informations de session sont gérées par le serveur d'applications, mais si plusieurs serveurs sont préparés et exploités pendant l'équilibrage de charge, les informations de session sont synchronisées entre plusieurs serveurs (réplication de session) ou entre l'utilisateur et le serveur. Il est nécessaire d'équilibrer la charge pour qu'il y ait une relation biunivoque (session persistante), ce qui est gênant.

Par conséquent, Spring Session peut être utilisé à bon escient lorsque vous souhaitez supprimer les informations de session vers un endroit autre que le serveur d'applications.

Utiliser la session de printemps

Créer un projet

Créez un projet Spring Boot avec Spring Initializr. https://start.spring.io/

Cette fois, j'ai ajouté ce qui suit en tant que dépendances.

Le SGBDR qui stocke les informations de session est PostgreSQL.

application.properties

application.properties


spring.session.store-type=jdbc
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver

Si vous définissez spring.session.store-type sur jdbc, vous aurez l'impression que les paramètres liés à SpringSession sont définis sans autorisation. Non, Spring Boot est pratique. (Spécifiez le paramètre de source de données en fonction de l'environnement.)

Configuration de la base de données

Je pense qu'il existe un moyen de le configurer automatiquement, mais je ne sais pas comment le faire, je vais donc créer une table pour stocker les informations de session. Il existe un fichier sql dans SpringSessionJdbc, vous pouvez donc l'exécuter. https://github.com/spring-projects/spring-session/tree/master/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc

Essayez de faire fonctionner la session

J'ai créé la classe Controller suivante et essayé de manipuler les informations de session.

HelloController.java


@Controller
public class HelloController {

	@Autowired
	SessionData sessionData;

	@GetMapping(value = "/")
	public String index() {
		return "index";
	}

	@GetMapping(value="/set")
	public String set(){
		sessionData.setStr1("hogehoge");
		sessionData.setStr2("fugafuga");
		sessionData.setStr3("piyopiyo");
		return "redirect:/";
	}
}

SessionData.java


@Data
@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class SessionData implements Serializable{
    private static final long serialVersionUID = 1L;
    String str1;
    String str2;
    String str3;
}

index.html


<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8" />
    <title>Hello Thymeleaf</title>
</head>

<body>
    <div>
        str1:
        <span th:text="${@sessionData.str1}">aaa</span>
    </div>
    <div>
        str2:
        <span th:text="${@sessionData.str2}">aaa</span>
    </div>
    <div>
        str3:
        <span th:text="${@sessionData.str3}">aaa</span>
    </div>
    <form th:action="@{/set}" method="get">
        <button>set</button>
    </form>
</body>

</html>

Pour l'implémentation, vous pouvez faire fonctionner la session comme d'habitude. Si vous vérifiez la base de données, vous pouvez voir que les informations de session y sont conservées.

Puisque les données sont sérialisées et stockées, il est nécessaire d'implémenter Serializable pour les informations de session.


Comme mentionné ci-dessus, les informations de session peuvent être facilement stockées dans le SGBDR. Personnellement, je pensais qu'il serait plus facile de gérer diverses choses si les informations étaient stockées en JSON. Il semble que la partie conversion de données puisse être personnalisée, mais j'ai abandonné car il semble difficile de changer le type de données. (Étant donné que le schéma de base de données change également, nous devons le refaire.)

De plus, il semble que l'implémentation qui utilise Redis fournit une méthode pour stocker les données dans JSON.

Recommended Posts

Stocker les informations de session dans la base de données avec Spring Session
Erreur de connexion à la base de données Spring
Modifier le délai d'expiration de la session dans Spring Boot
Inject Logger au printemps
Utilisez Interceptor au printemps
Microservices dans Spring Cloud
Obtenez des cookies au printemps
Spring Boot (série 1) + spring-security-oauth2 + Redis Session + Heroku avec SerializationException
Création d'un environnement de base de données avec Docker dans Spring Boot (IntellJ)
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3
[Rails] Comment afficher les informations stockées dans la base de données dans la vue
Définir le paramètre contextuel dans Spring Boot
Obtenir des informations EXIF en Java
Multi-projets Spring Boot 2 avec Gradle
Changements majeurs dans Spring Boot 1.5
NoHttpResponseException dans Spring Boot + WireMock
Étape de boucle avec Spring Batch
Comment stocker les informations saisies dans la zone de texte dans une variable de la méthode