Giới thiệu về Spring Session với Spring Session JDBC

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Spring Session là một module của Spring framework giúp chúng ta có thể quản lý session của user khi sử dụng web của chúng ta bằng một hệ thống lưu trữ khác thay vì quản lý session sử dụng server runtime. Hệ thống lưu trữ khác này có thể là một database system hoặc MongoDB hoặc Redis hoặc Hazelcast. Việc sử dụng Spring Session giúp chúng ta có thể giải quyết các vấn đề liên quan đến session trong deploy ứng dụng sử dụng load balancer, hay các giới hạn của HTTP session của server. Trong bài viết này, mình sẽ hướng dẫn các bạn cách sử dụng Spring Session để lưu thông tin session vào một database nào đó các bạn nhé!

  Cách sử dụng properties trong tập tin cấu hình của Spring
  Cài đặt Spring Boot CLI

Để làm ví dụ cho bài viết này, mình sẽ tạo mới một Spring Boot application với Spring Security, Spring Web và PostgreSQL JDBC Driver để store thông tin session như sau:

Kết quả:

Các bạn cần add Spring Session JDBC manually vào tập tin pom.xml:

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>

Các bạn không cần declare version của Spring Session JDBC, nó đã được manage bởi Spring Boot Parent.

Để chạy ứng dụng này lên, các bạn cần cấu hình thông tin Datasource trong tập tin application.properties vì chúng ta đã khai báo sử dụng Spring Data JPA:

spring.datasource.url=jdbc:postgresql://localhost:5432/spring_session_example
spring.datasource.username=khanh
spring.datasource.password=1

Nếu lúc này chạy ứng dụng, các bạn có thể đăng nhập ứng dụng với thông tin user mặc định của Spring Security là “user” và mật khẩu được in ra trong console log của IDE.

Thông tin về session của user sẽ được lưu trong HTTP session của server các bạn nhé!

Bây giờ, chúng ta sẽ cấu hình Spring Session JDBC để chuyển phần thông tin session này vào database nha các bạn!

Như mình đã nói, Spring Session hỗ trợ nhiều hệ thống lưu trữ khác nhau, trong bài viết này, chúng ta đang sử dụng database system. Để khai báo điều này, các bạn hãy mở tập tin application.properties và khai báo như sau:

spring.session.store-type=jdbc

Sẽ có một số table được Spring Session tạo ra mặc định để lưu trữ thông tin session. Tên của các table này là SPRING_SESSION để chứa thông tin user session và SPRING_SESSION_ATTRIBUTES để chứa thông tin chi tiết của từng session. Các bạn có thể mở file spring-session-jdbc jar file để xem định nghĩa của những table này:

Để khởi tạo các table này tự động, các bạn có thể thêm một property để làm điều này như sau:

spring.session.jdbc.initialize-schema=always

Chạy ứng dụng và kiểm tra database, các bạn sẽ thấy kết quả như sau:
Giờ thì chỉ cần đi đến ứng dụng sử dụng http://localhost:8080, các bạn sẽ thấy 2 table này generate những record như sau:

spring_session

spring_session_attributes:

Đây là thông tin về session mà chúng ta vừa request tới ứng dụng đó các bạn. Nếu bây giờ, các bạn login vào ứng dụng bằng thông tin mặc định của Spring Security, các bạn sẽ thấy data trong table spring_session như sau:

và:

Principal name lúc này đã được cập nhập là tên user mà chúng ta đã sử dụng để đăng nhập ứng dụng.

Các bạn có thể thay tên của table mặc định này bằng cách sử dụng property:

spring.session.jdbc.initialize-schema=always

với user_session là tên table chính chứa thông tin user session, tương đương với table mặc định spring_session.

Một session sẽ có thời gian timeout nếu user không còn hoạt động trên session đó nữa. Mặc định thì Spring Session cấu hình thời gian timeout này là 30 phút. Các bạn có thể thay đổi cấu hình này bằng cách sử dụng property:

spring.session.timeout=180

Sau khoảng thời gian này, session trong table trên sẽ bị xoá đi các bạn nhé!

Các hoạt động của Spring Session

Nếu các bạn muốn biết cách hoạt động của Spring Session thì hãy mở class SessionRepositoryFilter. Class filter này có nhiệm vụ chặn tất cả các request tới application và thay thế HttpServletRequest and HttpServletResponse mặc định của HTTP servlet bằng những class custom là SessionRepositoryRequestWrapper và SessionRepositoryResponseWrapper trong phương thức doFilterInternal().

SessionRepositoryRequestWrapper sẽ thực hiện việc commitSession() với mục đích insert thông tin về session vào database.

Đọc code thêm các bạn nhé!

Bài viết gốc được đăng tải tại huongdanjava.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev