Spring Session - MongoDB Repositories
Updating Dependencies
在使用 Spring Session MongoDB 前,您必须确保更新您的依赖项。我们假设您正在使用可正常运行的 Spring Boot Web 应用程序。如果您使用的是 Maven,确保添加以下依赖项:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-mongodb</artifactId>
</dependency>
</dependencies>
Spring Configuration
在添加所需的依赖项后,我们可以创建我们的 Spring 配置。Spring 配置负责创建 Servlet Filter,该 Servlet Filter 使用由 Spring Session 支持的实现来替换 HttpSession
实现。
您要做的就是添加以下 Spring 配置:
Unresolved include directive in modules/ROOT/pages/guides/boot-mongo.adoc - include::example$spring-session-samples/spring-session-sample-boot-mongodb-traditional/src/main/java/org/springframework/session/mongodb/examples/config/HttpSessionConfig.java[]
1 | @EnableMongoHttpSession`注释创建一个同名 Spring Bean `springSessionRepositoryFilter ,该 Bean 实现 Filter。此滤波器是使用 MongoDB 后盾 Bean 取代默认`HttpSession`的内容。 |
2 | 将会话超时配置到 30 分钟。 |
Configuring the MongoDB Connection
Spring Boot 自动创建 MongoClient
,它将 Spring Session 连接到本地主机上端口 27017(默认端口)的 MongoDB 服务器。在生产环境中,您需要确保更新您的配置,使其指向您的 MongoDB 服务器。例如,您可在 application.properties 中包含以下项:
spring.data.mongodb.host=mongo-srv spring.data.mongodb.port=27018 spring.data.mongodb.database=prod
如需了解更多信息,请参阅 Spring Boot 文档的“`HttpSession`到 MongoDB”({docs-url}/spring-boot/docs/current/reference/htmlsingle/#boot-features-connecting-to-mongodb)部分。
Servlet Container Initialization
我们的 Spring Configuration 创建了一个名为 springSessionRepositoryFilter
的 Spring Bean,该 Bean 实现 Filter
。springSessionRepositoryFilter
Bean 负责用由 Spring Session 支持的自定义实现替换 HttpSession
。
为了让我们的 Filter
执行其魔力,Spring 需要加载我们的 Config
类。最后,我们需要确保我们的 Servlet 容器(即 Tomcat)对每个请求使用我们的 springSessionRepositoryFilter
。幸运的是,Spring Boot 为我们处理这两个步骤。
MongoDB Sample Application
MongoDB 示例应用程序演示了如何使用 Spring Session 透明利用 MongoDB 来支持使用 Spring Boot 时 Web 应用程序的 HttpSession
。
Running the MongoDB Sample Application
您可以获取 源代码 并调用以下命令运行示例:
$ ./gradlew :samples:mongo:bootRun
您现在应该能够访问 [role="bare"][role="bare"]http://localhost:8080/ 中的应用程序。
Exploring the security Sample Application
尝试使用该应用程序。输入以下内容以登录:
-
Username user
-
Password password
现在,单击 Login 按钮。你现在应该看到一条消息,指出你已使用之前输入的用户登录。用户的相关信息存储在 MongoDB 中,而不是 Tomcat 的 HttpSession
实现中。
How does it work?
我们实际上是将值持久化到 Mongo 中,而不用使用 Tomcat 的 HttpSession
。Spring Session 用支持 Mongo 的实现替换了 HttpSession
。当 Spring Security 的 SecurityContextPersistenceFilter
将 SecurityContext
保存到 HttpSession
中时,它就会持久化到 Mongo 中。
当创建一个新的 HttpSession
时,Spring Session 会在你的浏览器中创建一个名为 SESSION 的 cookie,其中包含你会话的 id。继续,使用 Chrome 或 Firefox 查看 cookie(点击以获得帮助)。
如果你愿意,可以使用 mongo 客户端轻松检查会话。例如,在基于 Linux 的系统上,可以输入:
示例应用程序使用内嵌式 MongoDB 实例,该实例侦听随机分配的端口。在应用程序启动期间会记录内嵌式 MongoDB 使用的端口,以及连接其的确切命令。 |
$ mongo --port … > use test > db.sessions.find().pretty()
或者,你还可以删除显式密钥。输入以下内容到你的终端,确保用 SESSION Cookie 的值替换 60f17293-839b-477c-bb92-07a9c3658843
:
db.sessions.remove({"_id":"60f17293-839b-477c-bb92-07a9c3658843"})
现在,再次访问 [role="bare"][role="bare"]http://localhost:8080/ 中的应用程序,并观察不再对我们进行身份验证的情况。