Spring Session - 自定義 Cookie
本指南介紹如何使用 Java 配置將 Spring Session 配置為使用自定義 cookie。本指南假定您已在專案中使用您選擇的資料儲存設定了 Spring Session。例如,帶有 Redis 的 HttpSession。
您可以在自定義 Cookie 示例應用程式中找到完整的指南。 |
Spring Java 配置
設定 Spring Session 後,您可以透過將 CookieSerializer
公開為 Spring bean 來定製 session 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]+)$ 。這允許在不同域和應用程式之間共享 session。如果正則表示式不匹配,則不設定 domain,並使用現有 domain。如果正則表示式匹配,則第一個分組將用作 domain。這意味著對 child.example.com 的請求會將 domain 設定為 example.com 。但是,對 localhost:8080/ 或 192.168.1.100:8080/ 的請求不會設定 cookie 的 domain,因此在開發環境中仍然可以工作,無需為生產環境進行任何更改。 |
您應該只匹配有效的域名字元,因為域名會反映在響應中。這樣做可以防止惡意使用者執行諸如 HTTP 響應拆分之類的攻擊。 |
配置選項
以下配置選項可用
-
cookieName
:要使用的 cookie 名稱。預設值:SESSION
。 -
useSecureCookie
:指定是否應使用安全 cookie。預設值:建立時使用HttpServletRequest.isSecure()
的值。 -
cookiePath
:cookie 的路徑。預設值:上下文根路徑。 -
cookieMaxAge
:指定在建立 session 時設定的 cookie 的最大生存期。預設值:-1
,表示在瀏覽器關閉時應移除 cookie。 -
jvmRoute
:指定要附加到 session ID 幷包含在 cookie 中的字尾。用於識別要路由到哪個 JVM 以實現 session 親和性。對於某些實現(例如 Redis),此選項不提供效能優勢。但是,它可以幫助追蹤特定使用者的日誌。 -
domainName
:允許指定用於 cookie 的特定域名。此選項易於理解,但通常需要在開發和生產環境之間進行不同的配置。請參閱domainNamePattern
作為替代方案。 -
domainNamePattern
:一個不區分大小寫的模式,用於從HttpServletRequest#getServerName()
中提取域名。該模式應提供一個單獨的分組,用於提取 cookie 域的值。如果正則表示式不匹配,則不設定 domain,並使用現有 domain。如果正則表示式匹配,則第一個分組將用作 domain。 -
sameSite
:SameSite
cookie 指令的值。要停用SameSite
cookie 指令的序列化,您可以將此值設定為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 repository。 |
您現在應該可以透過 localhost:8080/ 訪問應用程式。