|
对于最新稳定版本,请使用 Spring Session 4.0.2! |
Spring Session - MongoDB Repositories
更新依赖项
在使用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 | The @EnableMongoHttpSession 注解创建一个名为 springSessionRepositoryFilter 的 Spring Bean,该 Bean 实现了 Filter。
这个过滤器将替换默认的 HttpSession 为带有 MongoDB 支持的 Bean。 |
| 2 | 配置会话超时为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
要获取更多信息,请参阅Spring Boot 文档中的连接MongoDB部分。
Servlet 容器初始化
我们的springSessionRepositoryFilter的Spring Bean,该Bean实现了Filter。
springSessionRepositoryFilter Bean负责用一个由Spring Session支持的自定义实现来替换HttpSession。
为了使我们的Filter发挥作用,Spring 需要加载我们的Config类。
最后我们需要确保我们的 Servlet 容器(即 Tomcat)为每个请求使用我们的springSessionRepositoryFilter。
幸运的是,Spring Boot 会为我们处理这两步。
MongoDB 示例应用程序
The MongoDB 样例应用展示了如何使用 Spring Session 透明地利用 MongoDB 来支持基于 Spring Boot 的 Web 应用程序的 HttpSession。
运行 MongoDB 示例应用程序
您可以运行示例程序,通过获取源代码并执行以下命令来实现:
$ ./gradlew :samples:mongo:bootRun
您应该能够通过以下地址访问应用:localhost:8080/
探索安全示例应用程序
尝试使用应用程序。请输入以下信息进行登录:
-
用户名 user
-
密码 密码
现在点击 登录 按钮。
您应该会看到一个消息,表明您已使用之前输入的用户名成功登录。
用户信息存储在 MongoDB 中,而不是 Tomcat 的 HttpSession 实现。
它是如何工作的?
我们实际上并不是使用 Tomcat 的 HttpSession,而是将这些值持久化到了 MongoDB 中。
Spring Session 用一个基于 MongoDB 实现的替代方案替换了 HttpSession。
当 Spring Security 的 SecurityContextPersistenceFilter 将 SecurityContext 保存到 HttpSession 中时,这些数据就会被持久化到 MongoDB 中。
当一个新的HttpSession被创建时,Spring Session会在您的浏览器中创建一个名为SESSION的cookie,并在其中包含您的会话id。
您可以查看一下cookie(点击此处获得帮助:Chrome 或 Firefox)。
如果您愿意,可以轻松地使用 MongoDB 客户端检查会话。例如,在基于 Linux 的系统上您可以输入:
|
该示例应用使用了一个嵌入式的MongoDB实例,该实例监听一个随机分配的端口。 在应用程序启动期间会记录用于连接嵌入式MongoDB的端口号以及具体的连接命令。 |
$ mongo --port ... > use test > db.sessions.find().pretty()
alternatively,您也可以删除显式的密钥。请在终端中输入以下命令,并确保将60f17293-839b-477c-bb92-07a9c3658843替换为您的SESSIONcookie的值:
> db.sessions.remove({"_id":"60f17293-839b-477c-bb92-07a9c3658843"})
现在访问应用,在localhost:8080/,观察我们不再进行身份验证。