Spring Boot 1.5.2.RELEASE如何实现数据库存储HTTP会话?
嗨,我来帮你搞定Spring Boot 1.5.2.RELEASE里的JDBC会话存储配置~毕竟1.x和2.x版本的配置逻辑差异确实不小,之前在2.x里用的自动配置属性在1.5里可不适用哦。下面是一步步的配置方案:
1. 引入依赖
Spring Boot 1.5.x的spring-boot-starter-session默认不会自动引入JDBC存储的依赖,所以需要手动添加spring-session-jdbc。如果用Maven,在pom.xml里加入:
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-jdbc</artifactId> <!-- Spring Boot 1.5.2.RELEASE的依赖管理已经指定了兼容的1.3.x版本,可省略version --> </dependency>
如果是Gradle,添加:
compile 'org.springframework.session:spring-session-jdbc'
2. 启用JDBC会话存储配置
创建一个配置类,通过@EnableJdbcHttpSession注解开启JDBC会话存储功能:
import org.springframework.context.annotation.Configuration; import org.springframework.session.jdbc.config.annotation.web.http.EnableJdbcHttpSession; @Configuration @EnableJdbcHttpSession public class HttpSessionConfig { // 无需额外代码,Spring会自动使用你配置的数据源 }
3. 配置数据库连接
在application.properties(或application.yml)里配置你的数据库连接信息,以MySQL为例:
# 数据库连接配置 spring.datasource.url=jdbc:mysql://localhost:3306/your_db_name?useUnicode=true&characterEncoding=utf8&useSSL=false spring.datasource.username=your_db_user spring.datasource.password=your_db_password spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 会话超时时间(可选,单位秒,默认30分钟) server.session.timeout=1800
4. 初始化会话表(关键!)
Spring Session 1.3不会像2.x那样自动创建spring_session和spring_session_attributes表,你需要手动初始化这两张表,有两种方式:
方式一:手动执行SQL脚本
直接在你的数据库里执行官方提供的SQL脚本(以MySQL为例):
CREATE TABLE IF NOT EXISTS SPRING_SESSION ( PRIMARY_ID CHAR(36) NOT NULL, SESSION_ID CHAR(36) NOT NULL, 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_PK PRIMARY KEY (PRIMARY_ID) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; CREATE UNIQUE INDEX IF NOT EXISTS SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID); CREATE INDEX IF NOT EXISTS SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME); CREATE INDEX IF NOT EXISTS SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME); CREATE TABLE IF NOT EXISTS SPRING_SESSION_ATTRIBUTES ( SESSION_PRIMARY_ID CHAR(36) NOT NULL, ATTRIBUTE_NAME VARCHAR(200) NOT NULL, ATTRIBUTE_BYTES BLOB 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 ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
不同数据库的脚本略有差异,你可以在spring-session-jdbc的jar包中找到对应数据库的脚本(路径:org/springframework/session/jdbc/schema-*.sql)。
方式二:让Spring Boot自动执行脚本
把上述SQL脚本保存到src/main/resources/schema.sql,然后在application.properties中添加:
# 指定初始化脚本位置 spring.datasource.schema=classpath:schema.sql # 启动时执行初始化脚本 spring.datasource.initialization-mode=always
这样应用启动时会自动执行脚本创建表。
5. 测试验证
启动应用后,你可以登录或创建会话,然后查看数据库中的spring_session和spring_session_attributes表,应该能看到会话数据被存储进去了。
内容的提问来源于stack exchange,提问作者Frankie

