Spring Session - Spring Boot

本指南介紹瞭如何在使用 Spring Boot 時,利用 Spring Session 透明地使用 Redis 來支援 Web 應用程式的 HttpSession

你可以在引導示例應用程式中找到完整的指南。

更新依賴項

在使用 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,它實現了 Filter 介面。springSessionRepositoryFilter Bean 負責用一個由 Spring Session 支援的自定義實現替換 HttpSession

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

引導示例應用程式

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

執行引導示例應用程式

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

$ ./gradlew :spring-session-sample-boot-redis:bootRun
要使示例正常工作,您必須在本地主機上安裝 Redis 2.8+ 並以預設埠(6379)執行它。或者,您可以更新 RedisConnectionFactory 以指向 Redis 伺服器。另一種選擇是使用 Docker 在本地主機上執行 Redis。有關詳細說明,請參閱Docker Redis 儲存庫

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

探索 security 示例應用程式

現在您可以嘗試使用該應用程式了。輸入以下資訊登入:

  • 使用者名稱 user

  • 密碼 password

現在點選登入按鈕。您應該會看到一條訊息,表明您已使用之前輸入的使用者名稱登入。使用者的詳細資訊儲存在 Redis 中,而不是 Tomcat 的 HttpSession 實現中。

它是如何工作的?

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

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

您可以使用 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/ 並觀察到我們不再經過身份驗證。

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