此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Session 3.5.2spring-doc.cadn.net.cn

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 配置负责创建一个 Servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。spring-doc.cadn.net.cn

您所要做的就是添加以下 Spring 配置: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 @EnableMongoHttpSession注释创建一个名称为springSessionRepositoryFilter实现 Filter 的。 此过滤器取代了默认的HttpSession使用 MongoDB 支持的 bean。
2 将会话超时配置为 30 分钟。

配置 MongoDB 连接

Spring Boot 会自动创建一个MongoClient将 Spring Session 连接到端口 27017(默认端口)上的本地主机上的 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

现在单击 登录 按钮。您现在应该会看到一条消息,指示您已使用之前输入的用户登录。用户的信息存储在 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