此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Session 3.4.0! |
Spring Session - Spring Boot
本指南介绍了如何使用 Spring Session 透明地利用 Redis 来支持 Web 应用程序的HttpSession
当您使用 Spring Boot 时。
您可以在 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 模块提供了依赖 Management,因此你不需要显式声明依赖版本。
Spring Boot 配置
添加所需的依赖项后,我们可以创建 Spring Boot 配置。 感谢一流的自动配置支持,只需添加依赖项 Spring Boot 就会为我们设置由 Redis 支持的 Spring Session。
在后台, Spring Boot 应用等效于手动添加的配置@EnableRedisHttpSession
注解。
这将创建一个名称为springSessionRepositoryFilter
实现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 连接到端口 6379(默认端口)上 localhost 上的 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
实现Filter
.
这springSessionRepositoryFilter
bean 负责将HttpSession
使用由 Spring Session 支持的自定义实现。
为了我们的Filter
为了发挥它的魔力,Spring 需要加载我们的Config
类。
最后,我们需要确保我们的 servlet 容器(即 Tomcat)使用我们的springSessionRepositoryFilter
对于每个请求。
幸运的是,Spring Boot 为我们处理了这两个步骤。
引导示例应用程序
引导示例应用程序演示了如何使用 Spring Session 透明地利用 Redis 来支持 Web 应用程序的HttpSession
当您使用 Spring Boot 时。
运行 Boot 示例应用程序
您可以通过获取源码并调用以下命令来运行该示例:
$ ./gradlew :spring-session-sample-boot-redis:bootRun
要使该示例正常工作,您必须在 localhost 上安装 Redis 2.8+,并使用默认端口 (6379) 运行它。
或者,您也可以更新RedisConnectionFactory 以指向 Redis 服务器。
另一种选择是使用 Docker 在本地主机上运行 Redis。有关详细说明,请参阅 Docker Redis 存储库。 |
您现在应该能够访问 localhost:8080/ 中的应用程序
探索security
示例应用程序
现在您可以尝试使用该应用程序。输入以下内容以登录:
-
用户名 user
-
密码 密码
现在单击 Login 按钮。
您现在应该会看到一条消息,指示您已使用之前输入的用户登录。
用户的信息存储在 Redis 中,而不是 Tomcat 的HttpSession
实现。
它是如何工作的?
而不是使用 Tomcat 的HttpSession
,我们将值保存在 Redis 中。
Spring Session 取代了HttpSession
使用由 Redis 支持的实现。
当 Spring Security 的SecurityContextPersistenceFilter
保存SecurityContext
到HttpSession
,然后将其持久化到 Redis 中。
当新的HttpSession
时,Spring Session 会创建一个名为SESSION
在浏览器中。
该 Cookie 包含会话的 ID。
您可以查看 Cookie(使用 Chrome 或 Firefox)。
您可以使用 redis-cli 删除会话。 例如,在基于 Linux 的系统上,您可以键入以下内容:
$ redis-cli keys '*' | xargs redis-cli del
Redis 文档包含安装 redis-cli 的说明。 |
或者,您也可以删除显式密钥。
为此,请在您的终端中输入以下内容,并确保将7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
与您的SESSION
饼干:
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
现在,您可以访问 localhost:8080/ 上的应用程序,并观察到我们不再经过身份验证。