51. 如何在Spring Boot中管理Session?如何配置Session持久化?
在 Spring Boot 中,Session 管理是通过 Spring Session 实现的。Spring Session 提供了一种透明的方式来替换 HttpSession
,并支持在分布式环境中共享会话数据。它支持多种持久化存储方式,如 Redis、JDBC(关系型数据库)、Hazelcast 等。
1. 基本的 Session 管理
Spring Boot 默认使用 HttpSession
在服务器内存中存储会话数据。你可以通过 application.properties
文件来配置一些基础的 Session 管理选项。
application.properties
示例:
# 设置Session超时时间(单位:秒)
server.servlet.session.timeout=1800
# 配置Session的Cookie名称
server.servlet.session.cookie.name=MYSESSIONID
# 配置Session的Cookie路径
server.servlet.session.cookie.path=/
# 配置Session的Cookie域名
server.servlet.session.cookie.domain=mydomain.com
# 配置Session的Cookie是否仅限于HTTPS
server.servlet.session.cookie.secure=true
# 配置Session的Cookie的HttpOnly属性
server.servlet.session.cookie.http-only=true
2. 使用 Spring Session 管理 Session
Spring Session 支持将 Session 数据存储在不同的持久化存储中,这使得它特别适合在分布式环境下共享会话。
2.1 使用 Redis 进行 Session 持久化
Redis 是一种非常流行的键值存储,Spring Session 提供了良好的 Redis 集成,可以将 Session 数据存储在 Redis 中,以便在多个实例之间共享。
步骤:
引入依赖
Maven 配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
Gradle 配置:
implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.session:spring-session-data-redis'
配置 Redis 连接
application.properties
示例:spring.redis.host=localhost spring.redis.port=6379 # 配置Session超时时间(单位:秒) server.servlet.session.timeout=1800 # 配置Redis命名空间前缀 spring.session.redis.namespace=spring:session
启用 Spring Session
只需在主类中添加
@EnableRedisHttpSession
注解即可启用 Redis 作为 Session 存储。示例:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; @SpringBootApplication @EnableRedisHttpSession public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
@EnableRedisHttpSession
:这个注解启用了 Redis 作为HttpSession
的存储。
2.2 使用 JDBC 进行 Session 持久化
如果你希望将 Session 数据存储在关系型数据库中,可以使用 Spring Session 的 JDBC 支持。
步骤:
引入依赖
Maven 配置:
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-jdbc</artifactId> </dependency>
Gradle 配置:
implementation 'org.springframework.session:spring-session-jdbc'
创建 Session 表
Spring Session 提供了一个用于存储会话数据的 SQL 脚本。你可以在项目中找到该脚本,并在数据库中运行。
示例 SQL:
CREATE TABLE SPRING_SESSION ( PRIMARY_ID CHAR(36) NOT NULL, SESSION_ID CHAR(36) NOT NULL PRIMARY KEY, CREATION_TIME BIGINT NOT NULL, LAST_ACCESS_TIME BIGINT NOT NULL, MAX_INACTIVE_INTERVAL INT NOT NULL, EXPIRY_TIME BIGINT NOT NULL, PRINCIPAL_NAME VARCHAR(100), CONSTRAINT SPRING_SESSION_IX1 UNIQUE (SESSION_ID), CONSTRAINT SPRING_SESSION_IX2 UNIQUE (PRIMARY_ID) ); CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (EXPIRY_TIME); CREATE TABLE SPRING_SESSION_ATTRIBUTES ( SESSION_PRIMARY_ID CHAR(36) NOT NULL, ATTRIBUTE_NAME VARCHAR(200) NOT NULL, ATTRIBUTE_BYTES BYTEA NOT NULL, CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME), CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE ); CREATE INDEX SPRING_SESSION_ATTRIBUTES_IX1 ON SPRING_SESSION_ATTRIBUTES (SESSION_PRIMARY_ID);
配置 JDBC 连接
application.properties
示例:spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=secret spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 配置Session超时时间(单位:秒) server.servlet.session.timeout=1800 # 启用Spring Session的JDBC存储 spring.session.store-type=jdbc
启用 Spring Session
如果你使用
spring.session.store-type=jdbc
,Spring Boot 会自动配置 JDBC 作为 Session 存储方式,你不需要额外的注解。
2.3 使用 Hazelcast 进行 Session 持久化
Hazelcast 是一个分布式内存对象存储,可以用于会话持久化和分布式缓存。
步骤:
引入依赖
Maven 配置:
<dependency> <groupId>com.hazelcast</groupId> <artifactId>hazelcast</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-hazelcast</artifactId> </dependency>
Gradle 配置:
implementation 'com.hazelcast:hazelcast' implementation 'org.springframework.session:spring-session-hazelcast'
配置 Hazelcast
Hazelcast 可以通过 XML 或 Java 配置来设置。
示例 XML 配置:
<hazelcast xmlns="http://www.hazelcast.com/schema/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.hazelcast.com/schema/config http://www.hazelcast.com/schema/config/hazelcast-config-3.12.xsd"> <network> <join> <multicast enabled="false"/> <tcp-ip enabled="true"> <member>127.0.0.1</member> </tcp-ip> </join> </network> </hazelcast>
启用 Spring Session
通过
@EnableHazelcastHttpSession
注解启用 Hazelcast 作为 Session 存储。示例:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.session.hazelcast.config.annotation.web.http.EnableHazelcastHttpSession; @SpringBootApplication @EnableHazelcastHttpSession public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
3. 总结
- 内存存储:默认情况下,Spring Boot 使用
HttpSession
将会话数据存储在服务器内存中。 - Redis 持久化:通过
spring-session-data-redis
可以将会话数据存储在 Redis 中,实现分布式会话管理。 - JDBC 持久化:通过
spring-session-jdbc
可以将会话数据存储在关系型数据库中。 - Hazelcast 持久化:通过
spring-session-hazelcast
可以将会话数据存储在 Hazelcast 中,适合分布式缓存和会话管理。
Spring Session 提供了灵活且强大的会话管理支持,可以根据应用需求选择适合的持久化方式。通过这些配置,你可以轻松地管理和共享会话数据,从而提高应用的可扩展性和稳定性。