跳到主要内容
版本:3.4.2

Spring Session - MongoDB 仓库

QWen Max 中英对照 MongoDB Spring Session - MongoDB Repositories

本指南描述了如何使用由 MongoDB 支持的 Spring Session。

备注

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

Index

更新依赖项​

在使用 Spring Session MongoDB 之前,你必须确保更新你的依赖项。我们假设你正在使用一个可运行的 Spring Boot Web 应用程序。如果你使用 Maven,请确保添加以下依赖项:

<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
}

}
  • @EnableMongoHttpSession 注解创建了一个名为 springSessionRepositoryFilter 的 Spring Bean,该 Bean 实现了 Filter 接口。这个过滤器会用基于 MongoDB 的 Bean 替换默认的 HttpSession。

  • 将会话超时时间配置为 30 分钟。

配置 MongoDB 连接​

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

spring.data.mongodb.host=mongo-srv
spring.data.mongodb.port=27018
spring.data.mongodb.database=prod

有关更多信息,请参阅 Connecting to MongoDB 部分的 Spring Boot 文档。

Servlet 容器初始化​

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

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

MongoDB 示例应用程序​

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

运行 MongoDB 示例应用程序​

你可以通过获取源代码并运行以下命令来运行示例:

$ ./gradlew :samples:mongo:bootRun

你现在应该能够访问 localhost:8080/ 上的应用程序了。

探索 security 示例应用​

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

  • 用户名 user

  • 密码 password

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

它是如何工作的?​

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

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

如果你愿意,你可以轻松地使用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/ 的应用程序,并观察我们不再处于认证状态。