(window.webpackJsonp=window.webpackJsonp||[]).push([[674],{1105:function(t,e,o){"use strict";o.r(e);var s=o(56),n=Object(s.a)({},(function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("h1",{attrs:{id:"spring-session-mongodb-存储库"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#spring-session-mongodb-存储库"}},[t._v("#")]),t._v(" Spring Session-MongoDB 存储库")]),t._v(" "),o("p",[t._v("本指南描述了如何使用由 MongoDB 支持的 Spring Session 。")]),t._v(" "),o("table",[o("thead",[o("tr",[o("th"),t._v(" "),o("th",[t._v("完整的指南可在"),o("a",{attrs:{href:"#mongo-sample"}},[t._v("Mongo 示例应用程序")]),t._v("中找到。")])])]),t._v(" "),o("tbody")]),t._v(" "),o("p",[o("RouterLink",{attrs:{to:"/spring-session/bootSamples/index.html"}},[t._v("Index")])],1),t._v(" "),o("h2",{attrs:{id:"更新依赖项"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#更新依赖项"}},[t._v("#")]),t._v(" 更新依赖项")]),t._v(" "),o("p",[t._v("在使用 Spring Session MongoDB 之前,必须确保更新依赖项。我们假设你正在使用一个有效的启动 Web 应用程序。如果你正在使用 Maven,请确保添加以下依赖项:")]),t._v(" "),o("p",[t._v("POM.xml")]),t._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",{pre:!0,attrs:{class:"language-text"}},[o("code",[t._v("\n\t\x3c!-- ... --\x3e\n\t\n\t\torg.springframework.session\n\t\tspring-session-data-mongodb\n\t\n\n")])])]),o("p",[t._v("由于我们使用的是快照版本,因此我们需要确保添加 Spring 快照 Maven 存储库。确保在 POM.xml 中包含以下内容:")]),t._v(" "),o("p",[t._v("POM.xml")]),t._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",{pre:!0,attrs:{class:"language-text"}},[o("code",[t._v("\n\t\x3c!-- ... --\x3e\n\t\n\t\tspring-snapshot\n\t\thttps://repo.spring.io/libs-snapshot\n\t\n\n")])])]),o("h2",{attrs:{id:"spring-配置"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#spring-配置"}},[t._v("#")]),t._v(" Spring 配置")]),t._v(" "),o("p",[t._v("在添加了所需的依赖关系之后,我们就可以创建我们的 Spring 配置了。 Spring 配置负责创建一个 Servlet 过滤器,该过滤器将"),o("code",[t._v("HttpSession")]),t._v("实现替换为由 Spring Session 支持的实现。")]),t._v(" "),o("p",[t._v("你所要做的就是添加以下 Spring 配置:")]),t._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",{pre:!0,attrs:{class:"language-text"}},[o("code",[t._v("@EnableMongoHttpSession (1)\npublic class HttpSessionConfig {\n\n\t@Bean\n\tpublic JdkMongoSessionConverter jdkMongoSessionConverter() {\n\t\treturn new JdkMongoSessionConverter(Duration.ofMinutes(30)); (2)\n\t}\n\n}\n")])])]),o("table",[o("thead",[o("tr",[o("th",[o("strong",[t._v("1")])]),t._v(" "),o("th",[o("code",[t._v("@EnableMongoHttpSession")]),t._v("注释创建了一个名为"),o("code",[t._v("springSessionRepositoryFilter")]),t._v("的 Spring Bean,它实现了 filter。"),o("br"),t._v("这个 filter 用 MongoDB 支持的 Bean 替换了默认的"),o("code",[t._v("HttpSession")]),t._v("。")])])]),t._v(" "),o("tbody",[o("tr",[o("td",[o("strong",[t._v("2")])]),t._v(" "),o("td",[t._v("将会话超时时间配置为 30 分钟。")])])])]),t._v(" "),o("h2",{attrs:{id:"配置-mongodb-连接"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#配置-mongodb-连接"}},[t._v("#")]),t._v(" 配置 MongoDB 连接")]),t._v(" "),o("p",[t._v("Spring 引导会自动创建一个"),o("code",[t._v("MongoClient")]),t._v(",它将 Spring Session 连接到端口 27017(默认端口)上的 LocalHost 上的 MongoDB 服务器。在生产环境中,你需要确保更新配置以指向 MongoDB 服务器。例如,你可以在"),o("strong",[t._v("应用程序.属性")]),t._v("中包含以下内容")]),t._v(" "),o("p",[t._v("SRC/主/资源/应用程序.properties")]),t._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",{pre:!0,attrs:{class:"language-text"}},[o("code",[t._v("spring.data.mongodb.host=mongo-srv\nspring.data.mongodb.port=27018\nspring.data.mongodb.database=prod\n")])])]),o("p",[t._v("有关更多信息,请参阅 Spring 引导文档的"),o("a",{attrs:{href:"https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-connecting-to-mongodb",target:"_blank",rel:"noopener noreferrer"}},[t._v("连接到 MongoDB"),o("OutboundLink")],1),t._v("部分。")]),t._v(" "),o("h2",{attrs:{id:"servlet-容器初始化"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#servlet-容器初始化"}},[t._v("#")]),t._v(" Servlet 容器初始化")]),t._v(" "),o("p",[t._v("我们的"),o("a",{attrs:{href:"#boot-mongo-configuration"}},[t._v("Spring Configuration")]),t._v("创建了一个名为"),o("code",[t._v("springSessionRepositoryFilter")]),t._v("的 Spring Bean,它实现了"),o("code",[t._v("Filter")]),t._v("。"),o("code",[t._v("springSessionRepositoryFilter")]),t._v(" Bean 负责用 Spring Session 支持的自定义实现替换"),o("code",[t._v("HttpSession")]),t._v("。")]),t._v(" "),o("p",[t._v("为了让我们的"),o("code",[t._v("Filter")]),t._v("发挥其魔力, Spring 需要加载我们的"),o("code",[t._v("Config")]),t._v("类。最后,我们需要确保我们的 Servlet 容器(即 Tomcat)对每个请求使用我们的"),o("code",[t._v("springSessionRepositoryFilter")]),t._v("。幸运的是,Boot 为我们解决了这两个步骤。")]),t._v(" "),o("h2",{attrs:{id:"mongodb-示例应用程序"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#mongodb-示例应用程序"}},[t._v("#")]),t._v(" MongoDB 示例应用程序")]),t._v(" "),o("p",[t._v("MongoDB 示例应用程序演示了如何在使用 Spring 引导时使用 Spring Session 透明地利用 MongoDB 来支持 Web 应用程序的"),o("code",[t._v("HttpSession")]),t._v("。")]),t._v(" "),o("h3",{attrs:{id:"运行-mongodb-示例应用程序"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#运行-mongodb-示例应用程序"}},[t._v("#")]),t._v(" 运行 MongoDB 示例应用程序")]),t._v(" "),o("p",[t._v("你可以通过获取"),o("a",{attrs:{href:"https://github.com/spring-projects/spring-session/archive/main.zip",target:"_blank",rel:"noopener noreferrer"}},[t._v("源代码"),o("OutboundLink")],1),t._v("并调用以下命令来运行示例:")]),t._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",{pre:!0,attrs:{class:"language-text"}},[o("code",[t._v("$ ./gradlew :samples:mongo:bootRun\n")])])]),o("p",[t._v("现在你应该可以在"),o("a",{attrs:{href:"http://localhost:8080/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8080/"),o("OutboundLink")],1),t._v("上访问应用程序了。")]),t._v(" "),o("h3",{attrs:{id:"探索安全示例应用程序"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#探索安全示例应用程序"}},[t._v("#")]),t._v(" 探索安全示例应用程序")]),t._v(" "),o("p",[t._v("尝试使用该应用程序。输入以下内容即可登录:")]),t._v(" "),o("ul",[o("li",[o("p",[o("strong",[t._v("用户 Name")]),t._v(" "),o("em",[t._v("User")])])]),t._v(" "),o("li",[o("p",[o("strong",[t._v("密码")]),t._v(" "),o("em",[t._v("密码")])])])]),t._v(" "),o("p",[t._v("现在点击"),o("strong",[t._v("登录")]),t._v("按钮。你现在应该会看到一条消息,表明你是用先前输入的用户登录的。用户的信息存储在 MongoDB 中,而不是 Tomcat 的"),o("code",[t._v("HttpSession")]),t._v("实现中。")]),t._v(" "),o("h3",{attrs:{id:"它是如何工作的"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#它是如何工作的"}},[t._v("#")]),t._v(" 它是如何工作的?")]),t._v(" "),o("p",[t._v("而不是使用 Tomcat 的"),o("code",[t._v("HttpSession")]),t._v(",我们实际上是在 Mongo 中持久化这些值。 Spring Session 用 Mongo 支持的实现替换"),o("code",[t._v("HttpSession")]),t._v("。当 Spring Security 的"),o("code",[t._v("SecurityContextPersistenceFilter")]),t._v("将"),o("code",[t._v("SecurityContext")]),t._v("保存到"),o("code",[t._v("HttpSession")]),t._v("时,它将被持久化到 Mongo 中。")]),t._v(" "),o("p",[t._v("当创建一个新的"),o("code",[t._v("HttpSession")]),t._v("时, Spring Session 将在浏览器中创建一个名为会话的 cookie,其中包含会话的 ID。继续查看 cookies(单击"),o("a",{attrs:{href:"https://developer.chrome.com/devtools/docs/resources#cookies",target:"_blank",rel:"noopener noreferrer"}},[t._v("Chrome"),o("OutboundLink")],1),t._v("或"),o("a",{attrs:{href:"https://getfirebug.com/wiki/index.php/Cookies_Panel#Cookies_List",target:"_blank",rel:"noopener noreferrer"}},[t._v("Firefox"),o("OutboundLink")],1),t._v("以获取帮助)。")]),t._v(" "),o("p",[t._v("如果你愿意,你可以使用 Mongo 客户机轻松地检查会话。例如,在基于 Linux 的系统上,你可以键入:")]),t._v(" "),o("table",[o("thead",[o("tr",[o("th"),t._v(" "),o("th",[t._v("示例应用程序使用了一个嵌入式 MongoDB 实例,该实例监听随机分配的端口。"),o("br"),t._v("嵌入式 MongoDB 使用的端口以及用于连接到它的 Exact 命令在应用程序启动时记录。")])])]),t._v(" "),o("tbody")]),t._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",{pre:!0,attrs:{class:"language-text"}},[o("code",[t._v("$ mongo --port ...\n> use test\n> db.sessions.find().pretty()\n")])])]),o("p",[t._v("或者,你也可以删除显式密钥。在终端中输入以下内容,以确保用会话 cookie 的值替换"),o("code",[t._v("60f17293-839b-477c-bb92-07a9c3658843")]),t._v(":")]),t._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",{pre:!0,attrs:{class:"language-text"}},[o("code",[t._v('> db.sessions.remove({"_id":"60f17293-839b-477c-bb92-07a9c3658843"})\n')])])]),o("p",[t._v("现在访问"),o("a",{attrs:{href:"http://localhost:8080/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://localhost:8080/"),o("OutboundLink")],1),t._v("上的应用程序,并观察到我们不再经过身份验证。")])])}),[],!1,null,null,null);e.default=n.exports}}]);