Spring Session - MongoDB 存储库
更新依赖项
在使用 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
implementation 替换为 Spring Session 支持的 implementation。
您所要做的就是添加以下 Spring Configuration:
@Configuration(proxyBeanMethods = false)
@EnableMongoHttpSession (1)
public class HttpSessionConfig {
@Bean
public JdkMongoSessionConverter jdkMongoSessionConverter() {
return new JdkMongoSessionConverter(Duration.ofMinutes(30)); (2)
}
}
1 | 这@EnableMongoHttpSession annotation 会创建一个名称为springSessionRepositoryFilter 实现 Filter 的 Filter。
此过滤器将替换默认的HttpSession 替换为 MongoDB 支持的 bean。 |
2 | 将会话超时配置为 30 分钟。 |
配置 MongoDB 连接
Spring Boot 会自动创建一个MongoClient
它将 Spring Session 连接到端口 27017(默认端口)上 localhost 上的 MongoDB 服务器。
在生产环境中,您需要确保更新配置以指向 MongoDB 服务器。
例如,您可以在 application.properties 中包含以下内容
spring.data.mongodb.host=mongo-srv spring.data.mongodb.port=27018 spring.data.mongodb.database=prod
有关更多信息,请参阅 Spring Boot 文档的 连接到 MongoDB 部分。
Servlet 容器初始化
我们的 Spring 配置创建了一个名为springSessionRepositoryFilter
实现Filter
.
这springSessionRepositoryFilter
bean 负责将HttpSession
使用由 Spring Session 支持的自定义实现。
为了我们的Filter
为了发挥它的魔力,Spring 需要加载我们的Config
类。
最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用我们的springSessionRepositoryFilter
对于每个请求。
幸运的是,Spring Boot 为我们处理了这两个步骤。
MongoDB 示例应用程序
MongoDB 示例应用程序演示了如何使用 Spring Session 透明地利用 MongoDB 来支持 Web 应用程序的HttpSession
使用 Spring Boot 时。
运行 MongoDB 示例应用程序
您可以通过获取源码并调用以下命令来运行该示例:
$ ./gradlew :samples:mongo:bootRun
您现在应该能够访问 localhost:8080/ 中的应用程序
探索安全性样本应用程序
尝试使用该应用程序。输入以下内容以登录:
-
用户名 user
-
密码 密码
现在单击 Login 按钮。
您现在应该会看到一条消息,指示您已使用之前输入的用户登录。
用户的信息存储在 MongoDB 中,而不是 Tomcat 的HttpSession
实现。
它是如何工作的?
而不是使用 Tomcat 的HttpSession
,我们实际上是在 Mongo 中持久化这些值。
Spring Session 取代了HttpSession
使用由 Mongo 支持的实现。
当 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/ 上的应用程序,并观察我们不再经过身份验证。