Spring Session - Spring Boot
更新依赖
在使用 Spring Session 与 Redis 之前,您必须确保已拥有正确的依赖。我们假设您正在使用一个可工作的 Spring Boot Web 应用。
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
</dependencies>
implementation("org.springframework.session:spring-session-data-redis")
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 Boot 文档的 Spring Session 部分。
配置 Redis 连接
Spring Boot 会自动创建一个 RedisConnectionFactory
,用于将 Spring Session 连接到 localhost 上端口 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,该 Bean 实现了 Filter
接口。springSessionRepositoryFilter
Bean 负责将 HttpSession
替换为由 Spring Session 提供支持的自定义实现。
为了让我们的 Filter
发挥作用,Spring 需要加载我们的 Config
类。最后,我们需要确保我们的 Servlet 容器(例如 Tomcat)为每个请求都使用 springSessionRepositoryFilter
。幸运的是,Spring Boot 为我们处理了这两个步骤。
Boot 示例应用
Boot 示例应用演示了如何在您使用 Spring Boot 时,利用 Spring Session 透明地使用 Redis 作为 Web 应用的 HttpSession
后端存储。
运行 Boot 示例应用
您可以通过获取源代码并调用以下命令来运行示例:
$ ./gradlew :spring-session-sample-boot-redis:bootRun
要使示例工作,您必须在 localhost 上安装 Redis 2.8+ 并使用默认端口(6379)运行它。或者,您可以更新 RedisConnectionFactory 以指向其他 Redis 服务器。另一种选择是使用 Docker 在 localhost 上运行 Redis。有关详细说明,请参阅 Docker Redis 仓库。 |
您现在应该可以通过 localhost:8080/ 访问应用程序。
探索 security
示例应用
现在您可以尝试使用该应用程序。输入以下内容进行登录:
-
用户名 user
-
密码 password
现在点击 Login 按钮。您应该会看到一条消息,表明您已使用之前输入的用户名登录。用户的会话信息存储在 Redis 中,而不是 Tomcat 的 HttpSession
实现中。
工作原理
我们不使用 Tomcat 的 HttpSession
,而是将值持久化到 Redis 中。Spring Session 将 HttpSession
替换为由 Redis 提供支持的实现。当 Spring Security 的 SecurityContextPersistenceFilter
将 SecurityContext
保存到 HttpSession
时,它就会被持久化到 Redis 中。
当创建一个新的 HttpSession
时,Spring Session 会在您的浏览器中创建一个名为 SESSION
的 Cookie。该 Cookie 包含您会话的 ID。您可以查看 Cookie(使用 Chrome 或 Firefox)。
您可以使用 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/ 查看,您会发现已不再处于认证状态。