Spring Session - MongoDB 仓库

本指南介绍如何使用由 MongoDB 提供支持的 Spring Session。

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

更新依赖

在使用 Spring Session MongoDB 之前,您必须确保更新您的依赖。我们假定您正在使用一个正常的 Spring Boot Web 应用程序。如果您使用 Maven,请确保添加以下依赖

pom.xml
<dependencies>
	<!-- ... -->
	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-mongodb</artifactId>
	</dependency>
</dependencies>

Spring 配置

添加必要的依赖后,我们可以创建 Spring 配置。Spring 配置负责创建一个 Servlet 过滤器,该过滤器会将 HttpSession 的实现替换为由 Spring Session 支持的实现。

您只需添加以下 Spring 配置即可

@Configuration(proxyBeanMethods = false)
@EnableMongoHttpSession (1)
public class HttpSessionConfig {

	@Bean
	public JdkMongoSessionConverter jdkMongoSessionConverter() {
		return new JdkMongoSessionConverter(Duration.ofMinutes(30)); (2)
	}

}
1 @EnableMongoHttpSession 注解会创建一个名为 springSessionRepositoryFilter 的 Spring Bean,该 Bean 实现了 Filter 接口。正是这个过滤器将默认的 HttpSession 替换为 MongoDB 支持的 Bean。
2 配置会话超时时间为 30 分钟。

配置 MongoDB 连接

Spring Boot 会自动创建一个 MongoClient,用于将 Spring Session 连接到 localhost 上端口 27017(默认端口)的 MongoDB 服务器。在生产环境中,您需要确保更新配置以指向您的 MongoDB 服务器。例如,您可以在 application.properties 中包含以下内容

src/main/resources/application.properties
spring.data.mongodb.host=mongo-srv
spring.data.mongodb.port=27018
spring.data.mongodb.database=prod

更多信息,请参考 Spring Boot 文档中 连接到 MongoDB 的部分。

Servlet 容器初始化

我们的 Spring 配置 创建了一个名为 springSessionRepositoryFilter 的 Spring Bean,该 Bean 实现了 Filter 接口。springSessionRepositoryFilter Bean 负责将 HttpSession 替换为由 Spring Session 支持的自定义实现。

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

MongoDB 示例应用程序

MongoDB 示例应用程序演示了如何在使用 Spring Boot 时,如何透明地利用 MongoDB 为 Web 应用程序的 HttpSession 提供支持。

运行 MongoDB 示例应用程序

您可以通过获取 源代码 并调用以下命令来运行示例

$ ./gradlew :samples:mongo:bootRun

您现在应该能够访问应用程序,地址为 localhost:8080/

探索安全示例应用程序

尝试使用该应用程序。输入以下内容进行登录

  • 用户名 user

  • 密码 password

现在点击 Login 按钮。您应该会看到一条消息,指示您已使用先前输入的用户名登录。用户信息存储在 MongoDB 中,而不是 Tomcat 的 HttpSession 实现中。

它是如何工作的?

我们实际上是将值持久化到 Mongo 中,而不是使用 Tomcat 的 HttpSession。Spring Session 将 HttpSession 替换为由 Mongo 支持的实现。当 Spring Security 的 SecurityContextPersistenceFilterSecurityContext 保存到 HttpSession 时,它随后会被持久化到 Mongo 中。

当创建新的 HttpSession 时,Spring Session 会在您的浏览器中创建一个名为 SESSION 的 Cookie,其中包含会话 ID。请查看 Cookie(点击获取 ChromeFirefox 的帮助)。

如果愿意,您可以使用 mongo 客户端轻松检查会话。例如,在基于 Linux 的系统上,您可以输入

示例应用程序使用了一个嵌入式 MongoDB 实例,该实例监听一个随机分配的端口。应用程序启动时会记录嵌入式 MongoDB 使用的端口以及连接到它的确切命令。

$ mongo --port ...
> use test
> db.sessions.find().pretty()

或者,您也可以删除明确的键。在您的终端中输入以下内容,确保将 60f17293-839b-477c-bb92-07a9c3658843 替换为您 SESSION Cookie 的值

> db.sessions.remove({"_id":"60f17293-839b-477c-bb92-07a9c3658843"})

现在访问应用程序,地址为 localhost:8080/,并观察到我们不再处于认证状态。