Sie können die Funktion von HttpSession überschreiben und die Sitzungsinformationen mit Redis oder RDBMS verwalten. Normalerweise werden Sitzungsinformationen vom Anwendungsserver verwaltet. Wenn jedoch mehrere Server während des Lastausgleichs vorbereitet und betrieben werden, werden die Sitzungsinformationen zwischen mehreren Servern (Sitzungsreplikation) oder Benutzer und Server synchronisiert. Es ist notwendig, die Last so auszugleichen, dass eine Eins-zu-Eins-Beziehung besteht (klebrige Sitzung), was problematisch ist.
Daher kann Spring Session gut verwendet werden, wenn Sie die Sitzungsinformationen an einem anderen Ort als dem Anwendungsserver ausschneiden möchten.
Erstellen Sie ein Spring Boot-Projekt mit Spring Initializr. https://start.spring.io/
Dieses Mal habe ich Folgendes als Abhängigkeiten hinzugefügt.
Das RDBMS, in dem Sitzungsinformationen gespeichert werden, ist 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
Wenn Sie spring.session.store-type auf jdbc setzen, werden die Einstellungen für SpringSession anscheinend ohne Erlaubnis vorgenommen. Nein, Spring Boot ist praktisch. (Geben Sie die Datenquelleneinstellung entsprechend der Umgebung an.)
Ich denke, es gibt eine Möglichkeit, es automatisch einzurichten, aber ich bin mir nicht sicher, wie ich es machen soll, also werde ich eine Tabelle zum Speichern der Sitzungsinformationen erstellen. In SpringSessionJdbc befindet sich eine SQL-Datei, sodass Sie sie ausführen können. https://github.com/spring-projects/spring-session/tree/master/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc
Ich habe die folgende Controller-Klasse erstellt und versucht, die Sitzungsinformationen zu bearbeiten.
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>
Zur Implementierung können Sie die Sitzung wie gewohnt ausführen. Wenn Sie die Datenbank überprüfen, können Sie sehen, dass die Sitzungsinformationen dort gespeichert sind.
Da die Daten serialisiert und gespeichert werden, muss Serializable für die Sitzungsinformationen implementiert werden.
Wie oben erwähnt, können Sitzungsinformationen einfach in RDBMS gespeichert werden. Persönlich dachte ich, es wäre einfacher, mit verschiedenen Dingen umzugehen, wenn die Informationen in JSON gespeichert würden. Es scheint, dass der Datenkonvertierungsteil angepasst werden kann, aber ich habe aufgegeben, weil es schwierig zu sein scheint, den Datentyp zu ändern. (Da sich auch das DB-Schema ändert, müssen wir es neu erstellen.)
Darüber hinaus scheint die Implementierung, die Redis verwendet, eine Methode zum Speichern von Daten in JSON bereitzustellen.
Recommended Posts