Spring Session - 自定義 Cookie
本指南介紹如何使用 Java 配置來配置 Spring Session 以使用自定義 Cookie。本指南假設您已使用您選擇的資料儲存在專案中設定了 Spring Session。例如,使用 Redis 的 HttpSession。
| 您可以在自定義 Cookie 示例應用程式中找到完整的指南。 |
Spring Java 配置
設定 Spring Session 後,您可以透過將 `CookieSerializer` 作為 Spring bean 公開來定製會話 Cookie 的寫入方式。Spring Session 附帶 `DefaultCookieSerializer`。當您使用 `@EnableRedisHttpSession` 等配置時,將 `DefaultCookieSerializer` 作為 Spring bean 公開會增強現有配置。以下示例展示瞭如何定製 Spring Session 的 Cookie
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("JSESSIONID"); (1)
serializer.setCookiePath("/"); (2)
serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$"); (3)
return serializer;
}
| 1 | 我們將 Cookie 的名稱定製為 JSESSIONID。 |
| 2 | 我們將 Cookie 的路徑定製為 /(而不是預設的上下文根)。 |
| 3 | 我們將域名模式(正則表示式)定製為 `^.?\\.(\\w\\.[a-z]+)$`。這允許在多個域和應用程式之間共享會話。如果正則表示式不匹配,則不設定任何域並使用現有域。如果正則表示式匹配,則第一個分組用作域。這意味著對 child.example.com 的請求將域設定為 `example.com`。然而,對 localhost:8080/ 或 192.168.1.100:8080/ 的請求則不設定 Cookie,因此在開發中仍然有效,無需對生產環境進行任何更改。 |
| 您應該只匹配有效的域名字元,因為域名會反映在響應中。這樣做可以防止惡意使用者執行諸如 HTTP 響應拆分之類的攻擊。 |
配置選項
以下是可用的配置選項
-
cookieName:要使用的 Cookie 名稱。預設值:SESSION。 -
useSecureCookie:指定是否應使用安全 Cookie。預設值:在建立時使用HttpServletRequest.isSecure()的值。 -
cookiePath:Cookie 的路徑。預設值:上下文根。 -
cookieMaxAge:指定在會話建立時要設定的 Cookie 的最大年齡。預設值:-1,表示當瀏覽器關閉時應刪除 Cookie。 -
jvmRoute:指定一個字尾,該字尾將附加到會話 ID 幷包含在 Cookie 中。用於識別要路由到哪個 JVM 以實現會話親和性。對於某些實現(即 Redis),此選項不提供效能優勢。但是,它可以幫助跟蹤特定使用者的日誌。 -
domainName:允許指定用於 Cookie 的特定域名。此選項易於理解,但通常需要在開發和生產環境之間進行不同的配置。請參閱domainNamePattern作為替代方案。 -
domainNamePattern:一個不區分大小寫的模式,用於從HttpServletRequest#getServerName()中提取域名。該模式應提供一個用於提取 Cookie 域值的分組。如果正則表示式不匹配,則不設定任何域並使用現有域。如果正則表示式匹配,則第一個分組用作域。 -
sameSite:SameSiteCookie 指令的值。要停用SameSiteCookie 指令的序列化,您可以將此值設定為null。預設值:Lax
| 您應該只匹配有效的域名字元,因為域名會反映在響應中。這樣做可以防止惡意使用者執行諸如 HTTP 響應拆分之類的攻擊。 |
custom-cookie 示例應用程式
本節介紹如何使用 custom-cookie 示例應用程式。
執行 custom-cookie 示例應用程式
您可以透過獲取原始碼並呼叫以下命令來執行示例:
$ ./gradlew :spring-session-sample-javaconfig-custom-cookie:tomcatRun
要使示例正常工作,您必須在本地主機上安裝 Redis 2.8+ 並以預設埠(6379)執行它。或者,您可以更新 RedisConnectionFactory 以指向 Redis 伺服器。另一種選擇是使用 Docker 在本地主機上執行 Redis。有關詳細說明,請參閱Docker Redis 儲存庫。 |
您現在應該能夠透過 localhost:8080/ 訪問該應用程式