Spring Session - 自定义 Cookie
本指南描述如何在 Java 配置中配置 Spring Session 使用自定义 cookie。本指南假设你已经使用所选的数据存储在项目中设置了 Spring Session。例如,将 HttpSession 与 Redis 结合使用。
你可以在 自定义 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;
}
我们将 cookie 的名称自定义为
JSESSIONID。我们将 cookie 的路径自定义为
/(而不是上下文根的默认值)。我们将域名模式(一个正则表达式)自定义为
^.?\\.(\\w\\.[a-z]+)$。这允许在多个域和应用程序之间共享会话。如果正则表达式不匹配,则不设置域,而使用现有域。如果正则表达式匹配,则使用第一个分组作为域。这意味着对 child.example.com 的请求会将域设置为example.com。不过,对 localhost:8080/ 或 192.168.1.100:8080/ 的请求会保留 cookie 未设置,因此在开发中仍然可用,而无需对生产环境做任何更改。
请注意,更改 cookie 的名称会使浏览器中已有的会话 cookie 失效;用户需要重新认证。
配置选项
以下配置选项可用:
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
如果你在生产环境中终止了会话,请确保用户的浏览器不再持有该会话的 cookie,否则该 cookie 可能会在会话过期后仍被使用。
custom-cookie 示例应用程序
本节描述如何使用 custom-cookie 示例应用程序。
运行 custom-cookie 示例应用程序
你可以通过获取源代码并运行以下命令来启动示例:
$ ./gradlew :spring-session-sample-javaconfig-custom-cookie:tomcatRun
要使示例正常工作,你必须在 localhost 上安装 Redis 2.8+ 并以默认端口(6379)运行。或者,你可以更新 RedisConnectionFactory 以指向 Redis 服务器。另一个选择是使用 Docker 在 localhost 上运行 Redis。详细说明请参阅 Docker Redis 仓库。
现在你应该可以通过 localhost:8080/ 访问该应用程序了。
探索 custom-cookie 示例应用程序
现在你可以使用该应用程序了。在表单中填写以下信息:
- 属性名称: username
- 属性值: rob
现在点击 Set Attribute 按钮。你现在应该能在表格中看到显示的值。
如果你查看该应用程序的 cookie,你会发现 cookie 被保存为自定义名称 JSESSIONID。