Spring Session - 自定義 Cookie

本指南介紹如何使用 Java 配置來配置 Spring Session 以使用自定義 Cookie。本指南假設您已使用您選擇的資料儲存在專案中設定了 Spring Session。例如,使用 Redis 的 HttpSession

您可以在自定義 Cookie 示例應用程式中找到完整的指南。

設定 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 域值的分組。如果正則表示式不匹配,則不設定任何域並使用現有域。如果正則表示式匹配,則第一個分組用作域。

  • sameSiteSameSite Cookie 指令的值。要停用 SameSite Cookie 指令的序列化,您可以將此值設定為 null。預設值:Lax

您應該只匹配有效的域名字元,因為域名會反映在響應中。這樣做可以防止惡意使用者執行諸如 HTTP 響應拆分之類的攻擊。

本節介紹如何使用 custom-cookie 示例應用程式。

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

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

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

現在您可以使用該應用程式。填寫以下資訊表單

  • 屬性名稱: username

  • 屬性值: rob

現在點選 設定屬性 按鈕。您現在應該會在表格中看到顯示的值。

如果您檢視應用程式的 Cookie,您可以看到 Cookie 以自定義名稱 JSESSIONID 儲存。

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