Spring Session - MongoDB 存储库

本指南介绍如何使用由 MongoDB 支持的 Spring Session。spring-doc.cadn.net.cn

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

更新依赖项

在使用 Spring Session MongoDB 之前,必须确保更新依赖项。 我们假设您正在使用一个正在运行的 Spring Boot Web 应用程序。 如果您使用的是 Maven,请确保添加以下依赖项:spring-doc.cadn.net.cn

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

Spring 配置

添加所需的依赖项后,我们可以创建 Spring 配置。 Spring 配置负责创建一个 Servlet 过滤器,该过滤器将HttpSessionimplementation 替换为 Spring Session 支持的 implementation。spring-doc.cadn.net.cn

您所要做的就是添加以下 Spring Configuration:spring-doc.cadn.net.cn

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

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

}
1 @EnableMongoHttpSessionannotation 会创建一个名称为springSessionRepositoryFilter实现 Filter 的 Filter。 此过滤器将替换默认的HttpSession替换为 MongoDB 支持的 bean。
2 将会话超时配置为 30 分钟。

配置 MongoDB 连接

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

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

有关更多信息,请参阅 Spring Boot 文档的 连接到 MongoDB 部分。spring-doc.cadn.net.cn

Servlet 容器初始化

我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。 最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用我们的springSessionRepositoryFilter对于每个请求。 幸运的是,Spring Boot 为我们处理了这两个步骤。spring-doc.cadn.net.cn

MongoDB 示例应用程序

MongoDB 示例应用程序演示了如何使用 Spring Session 透明地利用 MongoDB 来支持 Web 应用程序的HttpSession使用 Spring Boot 时。spring-doc.cadn.net.cn

运行 MongoDB 示例应用程序

您可以通过获取源码并调用以下命令来运行该示例:spring-doc.cadn.net.cn

$ ./gradlew :samples:mongo:bootRun

您现在应该能够访问 localhost:8080/ 中的应用程序spring-doc.cadn.net.cn

探索安全性样本应用程序

尝试使用该应用程序。输入以下内容以登录:spring-doc.cadn.net.cn

现在单击 Login 按钮。 您现在应该会看到一条消息,指示您已使用之前输入的用户登录。 用户的信息存储在 MongoDB 中,而不是 Tomcat 的HttpSession实现。spring-doc.cadn.net.cn

它是如何工作的?

而不是使用 Tomcat 的HttpSession,我们实际上是在 Mongo 中持久化这些值。 Spring Session 取代了HttpSession使用由 Mongo 支持的实现。 当 Spring Security 的SecurityContextPersistenceFilter保存SecurityContextHttpSession然后将其持久化到 Mongo 中。spring-doc.cadn.net.cn

当新的HttpSession时,Spring Session 会在浏览器中创建一个名为 SESSION 的 cookie,其中包含会话的 id。 继续查看 Cookie(单击以获取 ChromeFirefox 的帮助)。spring-doc.cadn.net.cn

如果您愿意,可以使用 mongo 客户端轻松检查会话。例如,在基于 Linux 的系统上,您可以键入:spring-doc.cadn.net.cn

示例应用程序使用一个嵌入式 MongoDB 实例,该实例侦听随机分配的端口。 嵌入式 MongoDB 使用的端口以及用于连接到它的确切命令在应用程序启动期间被记录下来。spring-doc.cadn.net.cn

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

或者,您也可以删除显式密钥。在您的终端中输入以下内容,确保将60f17293-839b-477c-bb92-07a9c3658843替换为您的 SESSION cookie 的值:spring-doc.cadn.net.cn

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

现在访问 localhost:8080/ 上的应用程序,并观察我们不再经过身份验证。spring-doc.cadn.net.cn