跳到主要内容

Spring Session - Spring Boot

QWen Max 中英对照 Redis with Events Spring Session - Spring Boot

本指南描述了如何使用Spring Session透明地利用Redis来支持Web应用程序的HttpSession,当你使用Spring Boot时。

备注

你可以在boot示例应用程序中找到完整的指南。

Index

更新依赖项

在使用 Redis 的 Spring Session 之前,您必须确保已具备正确的依赖项。我们假设您正在使用一个可正常运行的 Spring Boot Web 应用程序。

<dependencies>
<!-- ... -->

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
</dependencies>
xml
implementation("org.springframework.session:spring-session-data-redis")
groovy

Spring Boot 为 Spring Session 模块提供了依赖管理,因此你不必显式声明依赖版本。

Spring Boot 配置

添加所需的依赖项后,我们可以创建Spring Boot配置。得益于一流的一键配置支持,只需添加依赖项,Spring Boot 就会为我们设置由 Redis 支持的 Spring Session。

在底层,Spring Boot 应用的配置相当于手动添加 @EnableRedisHttpSession 注解。这会创建一个名为 springSessionRepositoryFilter 的 Spring bean,该 bean 实现了 Filter 接口。这个过滤器负责将 HttpSession 的实现替换为由 Spring Session 支持的实现。

可以通过使用 application.properties 进行进一步的自定义,如下所示:

server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds is used.
spring.session.redis.flush-mode=on_save # Sessions flush mode.
spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions.

有关更多信息,请参阅 Spring Session 部分的 Spring Boot 文档。

配置 Redis 连接

Spring Boot 会自动创建一个 RedisConnectionFactory,它将 Spring Session 连接到本地主机端口 6379(默认端口)上的 Redis 服务器。在生产环境中,你需要更新配置以指向你的 Redis 服务器。例如,你可以在 application.properties 中包含以下内容:

spring.data.redis.host=localhost # Redis server host.
spring.data.redis.password= # Login password of the redis server.
spring.data.redis.port=6379 # Redis server port.

有关更多信息,请参阅 Spring Boot 文档中的连接到 Redis部分。

Servlet 容器初始化

我们的 Spring Boot 配置 创建了一个名为 springSessionRepositoryFilter 的 Spring bean,它实现了 FilterspringSessionRepositoryFilter bean 负责用由 Spring Session 支持的自定义实现来替换 HttpSession

为了让我们的 Filter 发挥作用,Spring 需要加载我们的 Config 类。最后,我们需要确保我们的 servlet 容器(即 Tomcat)对每个请求都使用我们的 springSessionRepositoryFilter。幸运的是,Spring Boot 为我们处理了这两个步骤。

启动示例应用程序

Boot Sample Application 演示了如何使用 Spring Session 透明地利用 Redis 来支持 Web 应用程序的 HttpSession,当你使用 Spring Boot 时。

运行 Boot 示例应用程序

你可以通过获取源代码并运行以下命令来运行示例:

$ ./gradlew :spring-session-sample-boot-redis:bootRun
备注

为了让示例正常工作,你必须在本地主机上安装 Redis 2.8+ 并使用默认端口(6379)运行它。或者,你可以更新 RedisConnectionFactory 以指向一个 Redis 服务器。另一个选项是使用 Docker 在本地主机上运行 Redis。有关详细说明,请参阅 Docker Redis 仓库

你现在应该能够访问 localhost:8080/ 上的应用程序。

探索 security 示例应用程序

现在你可以尝试使用应用程序。输入以下内容进行登录:

  • 用户名 user

  • 密码 password

现在点击 登录 按钮。你应该会看到一条消息,表明你已使用之前输入的用户登录。用户的信息存储在 Redis 中,而不是 Tomcat 的 HttpSession 实现中。

它是如何工作的?

我们不使用 Tomcat 的 HttpSession,而是将值持久化到 Redis 中。Spring Session 用一个由 Redis 支持的实现来替换 HttpSession。当 Spring Security 的 SecurityContextPersistenceFilterSecurityContext 保存到 HttpSession 时,它就会被持久化到 Redis 中。

当创建一个新的 HttpSession 时,Spring Session 会在你的浏览器中创建一个名为 SESSION 的 cookie。该 cookie 包含了你的会话 ID。你可以查看 cookie(使用 ChromeFirefox)。

您可以使用 redis-cli 删除会话。例如,在基于 Linux 的系统上,您可以输入以下命令:

$ redis-cli keys '*' | xargs redis-cli del
提示

Redis 文档中有安装 redis-cli 的说明

或者,你也可以删除显式的密钥。为此,请在终端中输入以下命令,并确保将 7e8383a4-082c-4ffe-a4bc-c40fd3363c5e 替换为你的 SESSION cookie 的值:

$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

现在你可以访问 localhost:8080/,并观察到我们不再处于认证状态。