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 过滤器,该过滤器用由 Spring Session 支持的实现替换 HttpSession
实现。
您只需添加以下 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,它实现了 Filter。此过滤器将默认的 HttpSession 替换为由 MongoDB 支持的 Bean。 |
2 | 将会话超时时间配置为 30 分钟。 |
配置 MongoDB 连接
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 文档的 连接到 MongoDB 部分。
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/ 访问应用程序
探索安全示例应用程序
尝试使用该应用程序。输入以下内容登录
-
用户名 user
-
密码 password
现在点击登录按钮。您现在应该看到一条消息,表明您已使用之前输入的用户登录。用户信息存储在 MongoDB 中,而不是 Tomcat 的 HttpSession
实现中。
它是如何工作的?
我们实际上是在 Mongo 中持久化值,而不是使用 Tomcat 的 HttpSession
。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/ 上的应用程序,并观察到我们不再经过身份验证。