Spring Session - MongoDB 倉庫
更新依賴
在使用 Spring Session MongoDB 之前,您必須確保更新您的依賴。我們假定您正在使用一個正常的 Spring Boot Web 應用程式。如果您使用 Maven,請確保新增以下依賴
<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 中包含以下內容
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 實現了 Filter
介面。springSessionRepositoryFilter
Bean 負責將 HttpSession
替換為由 Spring Session 支援的自定義實現。
為了讓我們的 Filter
發揮作用,Spring 需要載入我們的 Config
類。最後,我們需要確保我們的 Servlet 容器(例如 Tomcat)對每個請求都使用我們的 springSessionRepositoryFilter
。幸運的是,Spring Boot 為我們處理了這兩個步驟。
MongoDB 示例應用程式
MongoDB 示例應用程式演示瞭如何在使用 Spring Boot 時,如何透明地利用 MongoDB 為 Web 應用程式的 HttpSession
提供支援。
執行 MongoDB 示例應用程式
您可以透過獲取 原始碼 並呼叫以下命令來執行示例
$ ./gradlew :samples:mongo:bootRun
您現在應該能夠訪問應用程式,地址為 localhost:8080/
探索安全示例應用程式
嘗試使用該應用程式。輸入以下內容進行登入
-
使用者名稱 user
-
密碼 password
現在點選 Login 按鈕。您應該會看到一條訊息,指示您已使用先前輸入的使用者名稱登入。使用者資訊儲存在 MongoDB 中,而不是 Tomcat 的 HttpSession
實現中。
它是如何工作的?
我們實際上是將值持久化到 Mongo 中,而不是使用 Tomcat 的 HttpSession
。Spring Session 將 HttpSession
替換為由 Mongo 支援的實現。當 Spring Security 的 SecurityContextPersistenceFilter
將 SecurityContext
儲存到 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/,並觀察到我們不再處於認證狀態。