跳到主要内容

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

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
}

}
java
  • @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,它实现了 FilterspringSessionRepositoryFilter 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的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/ 的应用程序,并观察我们不再处于认证状态。