Spring Session - Spring Boot
更新依賴
在使用 Spring Session 與 Redis 之前,您必須確保已擁有正確的依賴。我們假設您正在使用一個可工作的 Spring Boot Web 應用。
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
</dependencies>
implementation("org.springframework.session:spring-session-data-redis")
Spring Boot 為 Spring Session 模組提供了依賴管理,因此您無需顯式宣告依賴版本。
Spring Boot 配置
新增所需的依賴後,我們可以建立 Spring Boot 配置。得益於一流的自動配置支援,只需新增依賴,Spring Boot 就會為我們設定好由 Redis 提供支援的 Spring Session。
在底層,Spring Boot 應用的配置等同於手動新增 @EnableRedisHttpSession
註解。這會建立一個名為 springSessionRepositoryFilter
的 Spring Bean,該 Bean 實現了 Filter
介面。此過濾器負責將 HttpSession
實現替換為由 Spring Session 提供支援的實現。
可以透過使用 application.properties
進行進一步定製,如下所示:
server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds is used. spring.session.redis.flush-mode=on_save # Sessions flush mode. spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions.
更多資訊,請參閱 Spring Boot 文件的 Spring Session 部分。
配置 Redis 連線
Spring Boot 會自動建立一個 RedisConnectionFactory
,用於將 Spring Session 連線到 localhost 上埠 6379(預設埠)的 Redis 伺服器。在生產環境中,您需要更新配置以指向您的 Redis 伺服器。例如,您可以在 application.properties
中包含以下內容:
spring.data.redis.host=localhost # Redis server host. spring.data.redis.password= # Login password of the redis server. spring.data.redis.port=6379 # Redis server port.
更多資訊,請參閱 Spring Boot 文件的 連線到 Redis 部分。
Servlet 容器初始化
我們的 Spring Boot 配置 建立了一個名為 springSessionRepositoryFilter
的 Spring Bean,該 Bean 實現了 Filter
介面。springSessionRepositoryFilter
Bean 負責將 HttpSession
替換為由 Spring Session 提供支援的自定義實現。
為了讓我們的 Filter
發揮作用,Spring 需要載入我們的 Config
類。最後,我們需要確保我們的 Servlet 容器(例如 Tomcat)為每個請求都使用 springSessionRepositoryFilter
。幸運的是,Spring Boot 為我們處理了這兩個步驟。
Boot 示例應用
Boot 示例應用演示瞭如何在您使用 Spring Boot 時,利用 Spring Session 透明地使用 Redis 作為 Web 應用的 HttpSession
後端儲存。
執行 Boot 示例應用
您可以透過獲取原始碼並呼叫以下命令來執行示例:
$ ./gradlew :spring-session-sample-boot-redis:bootRun
要使示例工作,您必須在 localhost 上安裝 Redis 2.8+ 並使用預設埠(6379)執行它。或者,您可以更新 RedisConnectionFactory 以指向其他 Redis 伺服器。另一種選擇是使用 Docker 在 localhost 上執行 Redis。有關詳細說明,請參閱 Docker Redis 倉庫。 |
您現在應該可以透過 localhost:8080/ 訪問應用程式。
探索 security
示例應用
現在您可以嘗試使用該應用程式。輸入以下內容進行登入:
-
使用者名稱 user
-
密碼 password
現在點選 Login 按鈕。您應該會看到一條訊息,表明您已使用之前輸入的使用者名稱登入。使用者的會話資訊儲存在 Redis 中,而不是 Tomcat 的 HttpSession
實現中。
工作原理
我們不使用 Tomcat 的 HttpSession
,而是將值持久化到 Redis 中。Spring Session 將 HttpSession
替換為由 Redis 提供支援的實現。當 Spring Security 的 SecurityContextPersistenceFilter
將 SecurityContext
儲存到 HttpSession
時,它就會被持久化到 Redis 中。
當建立一個新的 HttpSession
時,Spring Session 會在您的瀏覽器中建立一個名為 SESSION
的 Cookie。該 Cookie 包含您會話的 ID。您可以檢視 Cookie(使用 Chrome 或 Firefox)。
您可以使用 redis-cli 刪除會話。例如,在基於 Linux 的系統中,您可以輸入以下內容:
$ redis-cli keys '*' | xargs redis-cli del
Redis 文件中有安裝 redis-cli 的說明。 |
或者,您也可以直接刪除顯式鍵。為此,在終端中輸入以下內容,請務必將 7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
替換為您 SESSION
cookie 的值:
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
現在您可以訪問 localhost:8080/ 檢視,您會發現已不再處於認證狀態。