对于最新稳定版本,请使用 Spring Session 4.0.2spring-doc.cadn.net.cn

Spring Session - MongoDB Repositories

此指南描述了如何使用基于MongoDB的Spring Session。spring-doc.cadn.net.cn

完成的指南可以在中找到。

更新依赖项

在使用Spring Session MongoDB之前,您必须确保更新依赖项。 我们假设您正在使用一个工作的Spring Boot Web应用程序。 如果您使用Maven,请确保添加以下依赖项:spring-doc.cadn.net.cn

pom.xml
<dependencies>
	<!-- ... -->
	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-mongodb</artifactId>
	</dependency>
</dependencies>

Spring 配置

在添加所需的依赖项后,我们可以创建我们的Spring配置。 Spring配置负责创建一个Servlet过滤器,该过滤器用由Spring Session支持的实现替换掉HttpSession的实现。spring-doc.cadn.net.cn

只需添加以下Spring配置即可:spring-doc.cadn.net.cn

@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.propertiesspring-doc.cadn.net.cn

src/main/resources/application.properties
spring.data.mongodb.host=mongo-srv
spring.data.mongodb.port=27018
spring.data.mongodb.database=prod

要获取更多信息,请参阅Spring Boot 文档中的连接MongoDB部分。spring-doc.cadn.net.cn

Servlet 容器初始化

我们的Spring Configuration创建了一个名为springSessionRepositoryFilter的Spring Bean,该Bean实现了FilterspringSessionRepositoryFilter Bean负责用一个由Spring Session支持的自定义实现来替换HttpSessionspring-doc.cadn.net.cn

为了使我们的Filter发挥作用,Spring 需要加载我们的Config类。 最后我们需要确保我们的 Servlet 容器(即 Tomcat)为每个请求使用我们的springSessionRepositoryFilter。 幸运的是,Spring Boot 会为我们处理这两步。spring-doc.cadn.net.cn

MongoDB 示例应用程序

The MongoDB 样例应用展示了如何使用 Spring Session 透明地利用 MongoDB 来支持基于 Spring Boot 的 Web 应用程序的 HttpSessionspring-doc.cadn.net.cn

运行 MongoDB 示例应用程序

您可以运行示例程序,通过获取源代码并执行以下命令来实现:spring-doc.cadn.net.cn

$ ./gradlew :samples:mongo:bootRun

您应该能够通过以下地址访问应用:localhost:8080/spring-doc.cadn.net.cn

探索安全示例应用程序

尝试使用应用程序。请输入以下信息进行登录:spring-doc.cadn.net.cn

现在点击 登录 按钮。 您应该会看到一个消息,表明您已使用之前输入的用户名成功登录。 用户信息存储在 MongoDB 中,而不是 Tomcat 的 HttpSession 实现。spring-doc.cadn.net.cn

它是如何工作的?

我们实际上并不是使用 Tomcat 的 HttpSession,而是将这些值持久化到了 MongoDB 中。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

Spring Session 用一个基于 MongoDB 实现的替代方案替换了 HttpSessionspring-doc.cadn.net.cn

当 Spring Security 的 SecurityContextPersistenceFilterSecurityContext 保存到 HttpSession 中时,这些数据就会被持久化到 MongoDB 中。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

当一个新的HttpSession被创建时,Spring Session会在您的浏览器中创建一个名为SESSION的cookie,并在其中包含您的会话id。 您可以查看一下cookie(点击此处获得帮助:ChromeFirefox)。spring-doc.cadn.net.cn

如果您愿意,可以轻松地使用 MongoDB 客户端检查会话。例如,在基于 Linux 的系统上您可以输入:spring-doc.cadn.net.cn

该示例应用使用了一个嵌入式的MongoDB实例,该实例监听一个随机分配的端口。 在应用程序启动期间会记录用于连接嵌入式MongoDB的端口号以及具体的连接命令。spring-doc.cadn.net.cn

$ mongo --port ...
> use test
> db.sessions.find().pretty()

alternatively,您也可以删除显式的密钥。请在终端中输入以下命令,并确保将60f17293-839b-477c-bb92-07a9c3658843替换为您的SESSIONcookie的值:spring-doc.cadn.net.cn

> db.sessions.remove({"_id":"60f17293-839b-477c-bb92-07a9c3658843"})

现在访问应用,在localhost:8080/,观察我们不再进行身份验证。spring-doc.cadn.net.cn