Spring Session - MongoDB 倉庫

本指南介紹瞭如何使用由 MongoDB 支援的 Spring Session。

完整的指南可在mongo 示例應用程式中找到。

更新依賴項

在使用 Spring Session MongoDB 之前,您必須確保更新您的依賴項。我們假設您正在使用一個正常執行的 Spring Boot Web 應用程式。如果您使用的是 Maven,請確保新增以下依賴項

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

Spring 配置

新增所需的依賴項後,我們可以建立 Spring 配置。Spring 配置負責建立一個 Servlet 過濾器,該過濾器將 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 的 Spring Bean,它實現了 Filter。此過濾器將預設的 HttpSession 替換為由 MongoDB 支援的 Bean。
2 將會話超時配置為 30 分鐘。

配置 MongoDB 連線

Spring Boot 會自動建立一個 MongoClient,將 Spring Session 連線到 localhost 上埠 27017(預設埠)的 MongoDB 伺服器。在生產環境中,您需要確保更新您的配置以指向您的 MongoDB 伺服器。例如,您可以在 application.properties 中包含以下內容

src/main/resources/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,它實現了 FilterspringSessionRepositoryFilter Bean 負責用由 Spring Session 支援的自定義實現替換 HttpSession

為了讓我們的 Filter 發揮作用,Spring 需要載入我們的 Config 類。最後,我們需要確保我們的 Servlet 容器(即 Tomcat)為每個請求使用我們的 springSessionRepositoryFilter。幸運的是,Spring Boot 為我們處理了這兩個步驟。

MongoDB 示例應用程式

MongoDB 示例應用程式演示瞭如何在使用 Spring Boot 時,利用 Spring Session 透明地使用 MongoDB 來支援 Web 應用程式的 HttpSession

執行 MongoDB 示例應用程式

您可以透過獲取原始碼並呼叫以下命令來執行示例:

$ ./gradlew :samples:mongo:bootRun

您現在應該能夠透過 localhost:8080/ 訪問該應用程式

探索安全示例應用程式

嘗試使用該應用程式。輸入以下內容登入

  • 使用者名稱 user

  • 密碼 password

現在單擊登入按鈕。您應該會看到一條訊息,指示您已使用之前輸入的使用者登入。使用者的資訊儲存在 MongoDB 中,而不是 Tomcat 的 HttpSession 實現中。

它是如何工作的?

我們沒有使用 Tomcat 的 HttpSession,而是將值持久化到 Mongo 中。Spring Session 將 HttpSession 替換為由 Mongo 支援的實現。當 Spring Security 的 SecurityContextPersistenceFilterSecurityContext 儲存到 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/,觀察我們已不再經過身份驗證。

© . This site is unofficial and not affiliated with VMware.