post-image

Spring Boot – Session Management

JDBC & Hibernate Spring Boot Starters & Common Configurations Tổng quan

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

Spring Boot HTTP Session

Để đạ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.

boot-50_6

Bắt đầu nhé

Maven Project sẽ có như hình dưới:

boot-50_5

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.

Spring Boot HTTP Session Object

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=900Code 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.

boot-50_1

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.

boot-50_2

Bảng spring_session.

boot-50_3

Bảng spring_session_attributes.

boot-50_4

Nguồn:

https://www.javainuse.com/spring/springboot_session

Leave a Reply

Your email address will not be published. Required fields are marked *