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 实现FilterspringSessionRepositoryFilterBean 负责将HttpSession替换为由 Spring Session 支持的自定义实现。

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

MongoDB 示例应用程序

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

运行 MongoDB 示例应用程序

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

$ ./gradlew :samples:mongo:bootRun

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

探索安全示例应用程序

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

  • 用户名 user

  • 密码 password

现在单击登录按钮。您现在应该会看到一条消息,指示您已使用之前输入的用户登录。用户的信息存储在 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/上的应用程序,并观察到我们不再经过身份验证。