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,該 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,該 Bean 實作 FilterspringSessionRepositoryFilter Bean 負責將 HttpSession 替換為由 Spring Session 支援的自訂實作。

為了讓我們的 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 實作中。

運作方式為何?

我們實際上是將值持久保存在 Mongo 中,而不是使用 Tomcat 的 HttpSession。Spring Session 將 HttpSession 替換為由 Mongo 支援的實作。當 Spring Security 的 SecurityContextPersistenceFilterSecurityContext 儲存到 HttpSession 時,它隨後會被持久保存在 Mongo 中。

當建立新的 HttpSession 時,Spring Session 會在您的瀏覽器中建立一個名為 SESSION 的 Cookie,其中包含您的工作階段 ID。繼續並檢視 Cookie (按一下以取得 ChromeFirefox 的說明)。

如果您願意,您可以使用 mongo client 輕鬆檢查工作階段。例如,在基於 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/ 上的應用程式,並觀察到我們不再通過驗證。