Spring Boot – Session Management
NỘI DUNG BÀI VIẾT
Trong bài viết này, mình sẽ thực hiện Session Management sử dụng Spring Boot. Đối với hướng dẫn này, mình sẽ sử dụng JDBC làm kho lưu trữ data cho các thông tin liên tục của Spring Session.
Trước tiên, chúng ta hãy xem Session Management là gì và cách thực hiện nó.
Session Management là gì?
Chúng ta đều biết rằng HTTP là giao thức không trạng thái. Tất cả các request và response là độc lập. Server không thể phân biệt giữa client truy cập mới và client truy cập trở lại. Nhưng đôi khi chúng ta có thể theo dõi hoạt động của cliet qua nhiều request. Điều này đạt được bằng cách sử dụng Session Management. Nó là cơ chế được Web container sử dụng để lưu trữ thông tin session cho 1 người dùng cụ thể. Session Management có thể đạt được bằng cách sử dụng 1 trong những cách sau:
- Cookies
- Hidden form field
- URL Rewwriting
- HttpSession
Trong ví dụ này, chúng ta sẽ sử dụng HttpSession để quản lý session. Ngoài ra tôi sẽ sử dụng Spring Session module.
Spring Session bao gồm các module sau:
- Spring Session Core – cung cấp các chức năng và API chính của Spring Session.
- Spring Session Data Redis – cung cấp triển khai SessionRepository và ReactiveSessionRepository được hỗ trợ bởi Redis và hỗ trợ cấu hình.
- Spring Session JDBC – cung cấp triển khai SessionRepository được hỗ trợ cấu hình và cơ sở dữ liệu quan hệ.
- Spring Session Hazelcast – cung cấp triển khai SessionRepository được hỗ trợ bởi Hazelcast và hỗ trợ cấu hình.
Trong bài viết này, chúng tôi sẽ sử dụng Spring Session JDBC để lưu trữ session về Spring. Theo mặc định thì Apache Tomcat lưu trữ các HTTP session object trong bộ nhớ.
Để đạt được việc ghi các object session vào MySQL, chúng ta không cần viết bất kỳ mã code nào. Spring Boot cung cấp cho chúng ta chứng năng này bằng cách chỉ định thuộc tính cấu hình sau:
spring.session.store-type=jdbc
Spring session thay thế triển khai HttpSession bằng 1 triển khai tùy chỉnh. Để thực hiện tác vụ này, Spring session tạo ra 1 SessionRepositoryFilter bean có tên là springSessionRepositoryFilter.
Bắt đầu nhé
Maven Project sẽ có như hình dưới:
Trong Maven, chúng ta cần Spring Session dependency. Mavan sẽ như sau
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.journaldev.spring</groupId>
<artifactId>Spring-Boot-Session-Example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Spring-Boot-Session-Example</name>
<description>Spring-Boot-Session-Example</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Code language: HTML, XML (xml)
SpringBootHelloWorldApplication.java
package com.javainuse;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootSessionApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootSessionApplication.class, args);
}
}
Code language: JavaScript (javascript)
SpringSessionController.java
package com.javainuse.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class SpringSessionController {
@GetMapping("/")
public String process(Model model, HttpSession session) {
@SuppressWarnings("unchecked")
List<String> messages = (List<String>) session.getAttribute("MY_SESSION_MESSAGES");
if (messages == null) {
messages = new ArrayList<>();
}
model.addAttribute("sessionMessages", messages);
return "index";
}
@PostMapping("/persistMessage")
public String persistMessage(@RequestParam("msg") String msg, HttpServletRequest request) {
@SuppressWarnings("unchecked")
List<String> messages = (List<String>) request.getSession().getAttribute("MY_SESSION_MESSAGES");
if (messages == null) {
messages = new ArrayList<>();
request.getSession().setAttribute("MY_SESSION_MESSAGES", messages);
}
messages.add(msg);
request.getSession().setAttribute("MY_SESSION_MESSAGES", messages);
return "redirect:/";
}
@PostMapping("/destroy")
public String destroySession(HttpServletRequest request) {
request.getSession().invalidate();
return "redirect:/";
}
}
Code language: JavaScript (javascript)
Vì vậy, nếu chưa có, tôi tạo 1 ArrayList có tên là MY_SESSION_MESSAGES trong HttpSession và duy trì các thông báo trong danh sach này.
application.properties.
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/springSession?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.initialization-mode=always
spring.h2.console.enabled=true
spring.session.store-type=jdbc
spring.session.jdbc.initialize-schema=always
spring.session.timeout.seconds=900
Code language: JavaScript (javascript)
index.html.
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Spring Boot Session Example</title>
</head>
<body>
<div>
<form th:action="@{/persistMessage}" method="post">
<textarea name="msg" cols="40" rows="2"></textarea>
<br> <input type="submit" value="Save Message" />
</form>
</div>
<div>
<h2>Messages</h2>
<ul th:each="message : ${sessionMessages}">
<li th:text="">msg</li>
</ul>
</div>
<div>
<form th:action="@{/destroy}" method="post">
<input type="submit" value="Destroy Session" />
</form>
</div>
</body>
</html>
Code language: HTML, XML (xml)
Compile và chạy SpringBootHelloWorldApplication.java như 1 Java application.
Mở trình duyệt web, truy cập localhost:8080.
Chúng ta có thể thêm các mục lưu trữ session. Spring session tạo 2 bảng để lưu trữ thông tin liên quan đến session.
Bảng spring_session.
Bảng spring_session_attributes.
Nguồn:
Leave a Reply