Spring Session - Spring Boot

本指南說明當您使用 Spring Boot 時,如何使用 Spring Session 透明地利用 Redis 來支援 Web 應用程式的 HttpSession

您可以在 boot 範例應用程式 中找到完整的指南。

更新依賴套件

在您將 Spring Session 與 Redis 一起使用之前,您必須確保您擁有正確的依賴套件。我們假設您正在使用一個可運作的 Spring Boot Web 應用程式。

pom.xml
<dependencies>
	<!-- ... -->

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
	</dependency>
</dependencies>
build.gradle
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,它實作了 Filter。此篩選器負責替換 HttpSession 實作,使其由 Spring Session 支援。

可以使用 application.properties 進行進一步的自訂,如下列清單所示

src/main/resources/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 中包含以下內容

src/main/resources/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,它實作了 FilterspringSessionRepositoryFilter 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

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

它是如何運作的?

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

當建立新的 HttpSession 時,Spring Session 會在您的瀏覽器中建立一個名為 SESSION 的 Cookie。該 Cookie 包含您 Session 的 ID。您可以使用 ChromeFirefox 查看 Cookie。

您可以使用 redis-cli 移除 Session。例如,在基於 Linux 的系統上,您可以輸入以下內容

	$ redis-cli keys '*' | xargs redis-cli del
Redis 文件中有關於 安裝 redis-cli 的說明。

或者,您也可以刪除明確的 Key。若要執行此操作,請在您的終端機中輸入以下內容,務必將 7e8383a4-082c-4ffe-a4bc-c40fd3363c5e 替換為您的 SESSION Cookie 的值

	$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

現在您可以透過 localhost:8080/ 存取應用程式,並觀察到我們不再通過驗證。