|
最新稳定版请使用Spring Session 3.5.3! |
Spring Session - MongoDB 仓库
更新依赖关系
在使用 Spring Session MongoDB 之前,您必须确保更新依赖。 我们假设你使用的是一个正常运行的 Spring Boot 网页应用。 如果你使用 Maven,务必添加以下依赖关系:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-mongodb</artifactId>
</dependency>
</dependencies>
Spring配置
添加所需的依赖后,我们可以创建 Spring 配置。
Spring配置负责创建一个ServletFilter,以替换HttpSession实现时,Spring Session支持的实现。
你只需添加以下Spring配置:
@Configuration(proxyBeanMethods = false)
@EnableMongoHttpSession (1)
public class HttpSessionConfig {
@Bean
public JdkMongoSessionConverter jdkMongoSessionConverter() {
return new JdkMongoSessionConverter(Duration.ofMinutes(30)); (2)
}
}
| 1 | 这@EnableMongoHttpSession注释生成一个名为springSessionRepositoryFilter该系统实现了过滤功能。
这个过滤器取代了默认的HttpSession使用MongoDB支持的豆子。 |
| 2 | 将会话超时设置为30分钟。 |
配置 MongoDB 连接
Spring Boot会自动生成Mongo客户端该系统将 Spring Session 连接到 localhost 上的 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 容器初始化
我们的Spring配置创建了一个名为springSessionRepositoryFilter实现Filter.
这springSessionRepositoryFilterBean负责替换HttpSession并采用由 Spring Session 支持的自定义实现。
为了我们的Filter要施展它的魔力,Spring需要加载我们的配置类。
最后,我们需要确保我们的Servlet容器(即Tomcat)使用我们的springSessionRepositoryFilter每一个请求。
幸运的是,Spring Boot 帮我们解决了这两个步骤。
MongoDB 示例应用
MongoDB 示例应用演示了如何利用 Spring Session 透明地利用 MongoDB 来支持一个网页应用HttpSession使用Spring Boot时。
运行MongoDB示例应用
您可以通过获取源代码并调用以下命令来运行示例:
$ ./gradlew :samples:mongo:bootRun
你现在应该可以在localhost:8080/访问该应用了
探索安全示例应用
试试用这个应用。请输入以下方式登录:
-
用户名
-
密码密码
现在点击登录按钮。
你现在应该会看到一条消息,表示你已经登录了之前输入的用户。
用户信息存储在 MongoDB 中,而非 Tomcat 的HttpSession实现。
它是如何运作的?
而不是用Tomcat的HttpSession,我们实际上是在Mongo中保持这些值。
Spring Session取代了HttpSession实现得到了Mongo的支持。
当春季安全SecurityContextPersistenceFilter节省安全上下文前往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/ 的应用程序,发现我们不再认证。