Spring Session - Spring Boot
本指南介绍了在使用 Spring Boot 时如何使用 Spring Session 透明利用 Redis 来支持 Web 应用程序的 HttpSession
。
您可以在boot sample application中找到已完成指南。 |
Updating Dependencies
在将 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 Configuration
添加所需依赖项后,我们可以创建我们的 Spring Boot 配置。得益于一流的自动配置支持,只需添加 Spring Boot 依赖项,即可设置 Spring Session,该程序由 Redis 为我们提供支持。
在内部,Spring Boot 应用的配置等效于手动添加 @EnableRedisHttpSession
注释。这将创建一个名称为 springSessionRepositoryFilter
的 Spring 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 文档中的 {docs-url}/spring-boot/docs/{spring-boot-version}/reference/htmlsingle/#boot-features-session[Spring Session] 部分。
Configuring the Redis Connection
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 文档的“`HttpSession`到 Redis”({docs-url}/spring-boot/docs/{spring-boot-version}/reference/htmlsingle/#boot-features-connecting-to-redis)部分。
Servlet Container Initialization
我们的 Spring Boot Configuration 创建了一个名为 springSessionRepositoryFilter
的 Spring Bean,该 Bean 实现 Filter
。springSessionRepositoryFilter
Bean 负责使用由 Spring Session 支持的自定义实现替换 HttpSession
。
为了让 Filter
发挥其作用,Spring 需要加载我们的 Config
类。最后,我们需要确保我们的 Servlet 容器(即 Tomcat)为每个请求使用我们的 springSessionRepositoryFilter
。幸运的是,Spring Boot 为我们处理这两步。
Boot Sample Application
Boot Sample 应用程序演示了如何使用 Spring Session 将 Redis 透明地利用为 Web 应用程序的 HttpSession
提供支持(当您使用 Spring Boot 时)。
Running the Boot Sample Application
您可以获取 源代码 并调用以下命令运行示例:
$ ./gradlew :spring-session-sample-boot-redis:bootRun
要让示例发挥作用,你必须在 localhost 上 install Redis 2.8+ 并使用默认端口 (6379) 运行它。或者,你可以更新 |
您现在应该能够访问 [role="bare"][role="bare"]http://localhost:8080/ 中的应用程序。
Exploring the security
Sample Application
现在,您可以尝试使用该应用程序。输入以下内容进行登录:
-
Username user
-
Password password
现在,单击 Login 按钮。现在,您应该会看到一条消息,提示您已使用之前输入的用户名登录。用户的的信息存储在 Redis 中,而不是 Tomcat 的 HttpSession
中。
How Does It Work?
我们不使用 Tomcat 的 HttpSession
,而将值存储在 Redis 中。Spring 会话使用由 Redis 支持的实现替换 HttpSession
。当 Spring 安全性的 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 文档包含有关 installing redis-cli 的说明。 |
或者,您还可以删除显式密钥。为此,请将以下内容输入到您的终端中,确保将 7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
替换为 SESSION
cookie 的值:
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
现在你可以访问位于 [role="bare"][role="bare"]http://localhost:8080/ 的应用,并观察我们不再处于经过身份验证状态。