Spring Session - MongoDB Repositories

本指南介绍了如何使用基于 MongoDB 的 Spring Session。

已完成的指南可在 mongo sample application 中找到。

Updating Dependencies

在使用 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 Configuration

在添加所需的依赖项后,我们可以创建我们的 Spring 配置。Spring 配置负责创建 Servlet Filter,该 Servlet Filter 使用由 Spring Session 支持的实现来替换 HttpSession 实现。

您要做的就是添加以下 Spring 配置:

Unresolved include directive in modules/ROOT/pages/guides/boot-mongo.adoc - include::example$spring-session-samples/spring-session-sample-boot-mongodb-traditional/src/main/java/org/springframework/session/mongodb/examples/config/HttpSessionConfig.java[]
1 @EnableMongoHttpSession`注释创建一个同名 Spring Bean `springSessionRepositoryFilter,该 Bean 实现 Filter。此滤波器是使用 MongoDB 后盾 Bean 取代默认`HttpSession`的内容。
2 将会话超时配置到 30 分钟。

Configuring the MongoDB Connection

Spring Boot 自动创建 MongoClient,它将 Spring Session 连接到本地主机上端口 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 文档的“`HttpSession`到 MongoDB”({docs-url}/spring-boot/docs/current/reference/htmlsingle/#boot-features-connecting-to-mongodb)部分。

Servlet Container Initialization

我们的 Spring Configuration 创建了一个名为 springSessionRepositoryFilter 的 Spring Bean,该 Bean 实现 FilterspringSessionRepositoryFilter Bean 负责用由 Spring Session 支持的自定义实现替换 HttpSession

为了让我们的 Filter 执行其魔力,Spring 需要加载我们的 Config 类。最后,我们需要确保我们的 Servlet 容器(即 Tomcat)对每个请求使用我们的 springSessionRepositoryFilter。幸运的是,Spring Boot 为我们处理这两个步骤。

MongoDB Sample Application

MongoDB 示例应用程序演示了如何使用 Spring Session 透明利用 MongoDB 来支持使用 Spring Boot 时 Web 应用程序的 HttpSession

Running the MongoDB Sample Application

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

$ ./gradlew :samples:mongo:bootRun

您现在应该能够访问 [role="bare"][role="bare"]http://localhost:8080/ 中的应用程序。

Exploring the security Sample Application

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

  • Username user

  • Password password

现在,单击 Login 按钮。你现在应该看到一条消息,指出你已使用之前输入的用户登录。用户的相关信息存储在 MongoDB 中,而不是 Tomcat 的 HttpSession 实现中。

How does it work?

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

当创建一个新的 HttpSession 时,Spring Session 会在你的浏览器中创建一个名为 SESSION 的 cookie,其中包含你会话的 id。继续,使用 ChromeFirefox 查看 cookie(点击以获得帮助)。

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

示例应用程序使用内嵌式 MongoDB 实例,该实例侦听随机分配的端口。在应用程序启动期间会记录内嵌式 MongoDB 使用的端口,以及连接其的确切命令。

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

或者,你还可以删除显式密钥。输入以下内容到你的终端,确保用 SESSION Cookie 的值替换 60f17293-839b-477c-bb92-07a9c3658843

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

现在,再次访问 [role="bare"][role="bare"]http://localhost:8080/ 中的应用程序,并观察不再对我们进行身份验证的情况。