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