Spring Session - Spring Boot
本指南介绍了如何在使用 Spring Boot 时,使用 Spring Session 透明地利用关系数据库来支持 Web 应用程序的 HttpSession
。
您可以在 httpsession-jdbc-boot 示例应用程序 中找到完整的指南。 |
更新依赖项
在使用 Spring Session 之前,您必须更新您的依赖项。我们假设您正在使用一个可运行的 Spring Boot Web 应用程序。如果您使用 Maven,则必须添加以下依赖项
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>
</dependencies>
Spring Boot 为 Spring Session 模块提供了依赖项管理,因此您无需显式声明依赖项版本。
Spring Boot 配置
添加所需的依赖项后,我们可以创建我们的 Spring Boot 配置。由于一流的自动配置支持,只需添加依赖项,Spring Boot 就会为我们设置由关系数据库支持的 Spring Session。
如果类路径上存在单个 Spring Session 模块,则 Spring Boot 会自动使用该存储实现。如果您有多个实现,则必须选择您希望用于存储会话的 StoreType,如上所示。
在幕后,Spring Boot 应用的配置等效于手动添加 @EnableJdbcHttpSession
注解。这会创建一个名为 springSessionRepositoryFilter
的 Spring Bean。该 Bean 实现 Filter
。过滤器负责替换 HttpSession
实现,使其由 Spring Session 支持。
您可以使用 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 Boot 文档的 Spring Session 部分。
配置 DataSource
Spring Boot 自动创建一个 DataSource
,将 Spring Session 连接到 H2 数据库的嵌入式实例。在生产环境中,您需要更新配置以指向您的关系数据库。例如,您可以在 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 文档的 配置数据源 部分。
Servlet 容器初始化
我们的 Spring Boot 配置 创建了一个名为 springSessionRepositoryFilter
的 Spring Bean,该 Bean 实现 Filter
。springSessionRepositoryFilter
Bean 负责用由 Spring Session 支持的自定义实现替换 HttpSession
。
为了让我们的 Filter
发挥其作用,Spring 需要加载我们的 Config
类。最后,我们需要确保我们的 Servlet 容器(即 Tomcat)对每个请求都使用我们的 springSessionRepositoryFilter
。幸运的是,Spring Boot 为我们处理了这两个步骤。
httpsession-jdbc-boot
示例应用程序
httpsession-jdbc-boot 示例应用程序演示了如何在使用 Spring Boot 时,使用 Spring Session 透明地利用 H2 数据库来支持 Web 应用程序的 HttpSession
。
运行 httpsession-jdbc-boot
示例应用程序
您可以通过获取 源代码 并调用以下命令来运行示例
$ ./gradlew :spring-session-sample-boot-jdbc:bootRun
现在您应该能够在 localhost:8080/ 访问该应用程序。
探索安全示例应用程序
您现在可以尝试使用该应用程序。为此,请输入以下内容以登录
-
用户名 user
-
密码 password
现在单击“登录”按钮。您现在应该会看到一条消息,指示您已使用之前输入的用户登录。用户的信息存储在 H2 数据库中,而不是 Tomcat 的 HttpSession
实现中。
它是如何工作的?
我们不是使用 Tomcat 的 HttpSession
,而是将值持久化到 H2 数据库中。Spring Session 将 HttpSession
替换为由关系数据库支持的实现。当 Spring Security 的 SecurityContextPersistenceFilter
将 SecurityContext
保存到 HttpSession
时,它会被持久化到 H2 数据库中。
创建新的 HttpSession
时,Spring Session 会在您的浏览器中创建一个名为 SESSION
的 Cookie。该 Cookie 包含您的会话 ID。您可以查看 Cookie(使用 Chrome 或 Firefox)。
您可以使用在以下位置提供的 H2 Web 控制台删除会话:localhost:8080/h2-console/(对 JDBC URL 使用 jdbc:h2:mem:testdb
)。
现在您可以访问 localhost:8080/ 上的应用程序,并看到我们不再经过身份验证。