对于最新稳定版本,请使用 Spring Session 4.0.2spring-doc.cadn.net.cn

Spring Session - Spring Boot

此指南描述了如何在使用 Spring Boot 时,通过 Spring Session 透明地利用关系数据库来支持 Web 应用程序的 HttpSessionspring-doc.cadn.net.cn

您可以在httpsession-jdbc-boot 样例应用 中找到完成的指南。

更新依赖项

在使用Spring Session之前,您必须更新您的依赖项。 我们假设您正在处理一个工作的Spring Boot Web应用程序。 如果您使用Maven,必须添加以下依赖项:spring-doc.cadn.net.cn

pom.xml
<dependencies>
	<!-- ... -->

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

Spring Boot 为 Spring Session 模块提供了依赖管理,因此你无需显式声明依赖版本。spring-doc.cadn.net.cn

Spring Boot 配置

在添加了所需的依赖项后,我们可以创建我们的Spring Boot配置。 得益于一流的自动配置支持,只需添加依赖项,Spring Boot 就会为我们设置基于关系数据库的 Spring Session。spring-doc.cadn.net.cn

如果类路径上仅存在一个 Spring Session 模块,Spring Boot 将会自动使用该存储实现。 如果有多个实现,则必须选择您希望用于存储会话的 StoreType,如上方所示。spring-doc.cadn.net.cn

在幕后,Spring Boot 应用了等同于手动添加 @EnableSessionSaveFilter 注解的配置。 这创建了一个名为 @EnableJdbcHttpSession 的 Spring 原型 bean。该 bean 实现了 springSessionRepositoryFilter 接口。 过滤器负责将 Filter 实现替换为由 Spring Session 支撑的实现。spring-doc.cadn.net.cn

您可以进一步自定义,可以使用application.properties。 以下示例展示了如何做到这一点:spring-doc.cadn.net.cn

src/main/resources/application.properties
server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds are used.
spring.session.jdbc.initialize-schema=embedded # Database schema initialization mode.
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
spring.session.jdbc.table-name=SPRING_SESSION # Name of the database table used to store sessions.

对于更多信息,请参阅Spring Session部分的Spring Boot 文档。spring-doc.cadn.net.cn

配置DataSource

Spring Boot 自动创建了一个 DataSource,将 Spring Session 连接到嵌入式的 H2 数据库实例。 在生产环境中,您需要更新配置以指向您的关系数据库。 例如,您可以在 application.properties 中包含以下内容:spring-doc.cadn.net.cn

src/main/resources/application.properties
spring.datasource.url= # JDBC URL of the database.
spring.datasource.username= # Login username of the database.
spring.datasource.password= # Login password of the database.

更多详细信息,请参阅Spring Boot 文档中的配置数据源部分。spring-doc.cadn.net.cn

Servlet 容器初始化

我们的 Spring Boot 配置 创建了一个名为 springSessionRepositoryFilter 的 Spring bean,它实现了 FilterspringSessionRepositoryFilter bean 负责用一个由 Spring Session 支撑的自定义实现来替换 HttpSessionspring-doc.cadn.net.cn

为了使我们的Filter发挥魔力,Spring 需要加载我们的Config类。 最后,我们需要确保我们的 servlet 容器(即 Tomcat)为每个请求使用我们的springSessionRepositoryFilter。 幸运的是,Spring Boot 会为我们处理这两个步骤。spring-doc.cadn.net.cn

httpsession-jdbc-boot示例应用程序

The httpsession-jdbc-boot 样例应用展示了如何使用 Spring Session 透明地利用 H2 数据库来为基于 Spring Boot 的 Web 应用程序的 HttpSession 提供支持。spring-doc.cadn.net.cn

运行httpsession-jdbc-boot示例应用程序

您可以运行示例程序,通过获取源代码并执行以下命令来实现:spring-doc.cadn.net.cn

$ ./gradlew :spring-session-sample-boot-jdbc:bootRun

您应该能够通过以下地址访问应用:localhost:8080/spring-doc.cadn.net.cn

探索安全示例应用程序

现在您可以尝试使用应用程序。 要进行操作,请输入以下内容登录:spring-doc.cadn.net.cn

现在点击 登录 按钮。 你应该会看到一条消息,表示你已使用之前输入的用户名成功登录。 用户信息存储在H2数据库中,而不是Tomcat的HttpSession实现。spring-doc.cadn.net.cn

它是如何工作的?

我们不是使用 Tomcat 的 HttpSession,而是将这些值持久化到 H2 数据库中。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

Spring Session 将 HttpSession 替换为一个由关系型数据库支持的实现。spring-doc.cadn.net.cn

当 Spring Security 的 SecurityContextPersistenceFilterSecurityContext 保存到 HttpSession 中时,它随后会持久化到 H2 数据库中。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

当一个新创建的HttpSession被创建时,Spring Session会在您的浏览器中创建一个名为SESSION的cookie。该cookie包含了您会话的ID。 您可以使用ChromeFirefox查看这些cookies。spring-doc.cadn.net.cn

您可以通过在以下位置使用 H2 网页控制台来移除会话:localhost:8080/h2-console/(对于 JDBC URL,请使用 jdbc:h2:mem:testdb)。spring-doc.cadn.net.cn

现在您可以在localhost:8080/访问应用程序,并看到我们已经不再需要身份验证了。spring-doc.cadn.net.cn