该版本仍在开发中,尚未被视为稳定。最新稳定版请使用Spring Session 3.5.3spring-doc.cadn.net.cn

常见配置

本节包含适用于所有或大多数春季会话模块的常见配置。 它包含以下用例的配置示例:spring-doc.cadn.net.cn

更改会话ID的生成方式

默认情况下,春季会话使用UuidSessionIdGenerator而该 又使用 一个java.util.UUID生成会话ID。 有些情况下,可能更适合加入其他角色以增加熵,或者你可能想用不同的算法生成会话ID。 要改变这一点,你可以提供自定义SessionIdGenerator豆:spring-doc.cadn.net.cn

更改会话ID的生成方式
@Bean
public SessionIdGenerator sessionIdGenerator() {
    return new MySessionIdGenerator();
}

class MySessionIdGenerator implements SessionIdGenerator {

    @Override
    public String generate() {
        // ...
    }

}

在暴露你的SessionIdGeneratorBean,Spring Session 会用它来生成会话 ID。spring-doc.cadn.net.cn

如果你是手动配置会话仓库豆子(代替使用@EnableRedisHttpSession例如,你可以设置SessionIdGenerator直接在会话仓库实现:spring-doc.cadn.net.cn

设置SessionIdGenerator直接进入会话仓库实现
@Bean
public RedisSessionRepository redisSessionRepository(RedisOperations redisOperations) {
    RedisSessionRepository repository = new RedisSessionRepository(redisOperations)
    repository.setSessionIdGenerator(new MySessionIdGenerator());
    return repository;
}

设置好春季会话后,你可以通过公开CookieSerializer作为春季豆。春季课程附带默认Cookie序列化器. 揭露默认Cookie序列化器因为 Spring Bean 在使用以下配置时对现有配置进行了补充@EnableRedisHttpSession. 以下示例展示了如何自定义春季课程的cookie:spring-doc.cadn.net.cn

	@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响应分拆等攻击。

以下配置选项可供选择:spring-doc.cadn.net.cn

  • cookieName:用来用的饼干名称。 违约:会期.spring-doc.cadn.net.cn

  • 使用SecureCookie: 指定是否应使用安全Cookie。默认:使用值HttpServletRequest.isSecure()在创造时期。spring-doc.cadn.net.cn

  • cookiePath(cookie路径):cookie的路径。默认:上下文根。spring-doc.cadn.net.cn

  • cookieMaxAge: 指定会话创建时 cookie 的最大年龄。 违约:-1,这表示浏览器关闭时应移除该 cookie。spring-doc.cadn.net.cn

  • jvm路线: 指定一个后缀要附加在会话 ID 后并包含在 Cookie 中。用于识别应路由哪个 JVM 以实现会话亲和性。在某些实现(如 Redis 中),该选项不带来性能提升。但它可以帮助追踪特定用户的日志。spring-doc.cadn.net.cn

  • 域名: 允许指定用于 cookie 的特定域名。该选项易于理解,但通常需要开发环境和生产环境之间的不同配置。 看域名模式作为替代方案。spring-doc.cadn.net.cn

  • 域名模式:用于从中提取域名的大小写不区分模式HttpServletRequest#getServerName(). 该模式应提供单一分组,用于提取 cookie 域的值。如果正则表达式不匹配,则不设置域,使用现有域。如果正则表达式匹配,则使用第一个分组作为域。spring-doc.cadn.net.cn

  • 同址同站cookie 指令。以禁用序列化同站Cookie 指令,你可以将此值设置为. 违约:宽松spring-doc.cadn.net.cn

  • rememberMeRequestAttribute: 请求属性名称,表示“记住我登录”。 如有指定,Cookie将写为Integer.MAX价值.spring-doc.cadn.net.cn

如果你正在使用Spring SessionRememberMeServices(Spring Session记忆服务)你是在宣告一种习俗默认Cookie序列化器豆子,你应该设置rememberMeRequestAttribute确保春季会话依赖会话过期而非cookie到期。 为此,您可以使用以下代码片段:defaultCookieSerializer.setRememberMeRequestAttribute(SpringSessionRememberMeServices.REMEMBER_ME_LOGIN_ATTR);spring-doc.cadn.net.cn

你可以通过在WebFlux应用中自定义会话Cookie的编写方式,通过暴露WebSessionIdResolver作为春豆。 春季课程使用CookieWebSessionIdResolver默认。 以下示例展示了如何自定义春季课程的cookie:spring-doc.cadn.net.cn

	@Bean
	public WebSessionIdResolver webSessionIdResolver() {
		CookieWebSessionIdResolver resolver = new CookieWebSessionIdResolver();
		resolver.setCookieName("JSESSIONID"); (1)
		resolver.addCookieInitializer((builder) -> builder.path("/")); (2)
		resolver.addCookieInitializer((builder) -> builder.sameSite("Strict")); (3)
		return resolver;
	}
1 我们会自定义 Cookie 的名称为JSESSIONID.
2 我们会自定义 cookie 的路径(而不是上下文根的默认路径)。/
3 我们会定制同站Cookie 指令严格.

提供春季会话实现ReactiveSessionRegistry

春季会话与春季安全集成,支持其被动并发会话控制。 这允许限制单个用户同时拥有的活跃会话数量,但与默认的 Spring Security 支持不同,这也适用于集群环境。 这通过提供SpringSessionBackedReactiveSessionRegistrySpring Security 的实现ReactiveSessionRegistry接口。spring-doc.cadn.net.cn

定义 SpringSessionBackedReactiveSessionRegistry 为 bean
@Bean
public <S extends Session> SpringSessionBackedReactiveSessionRegistry<S> sessionRegistry(
        ReactiveSessionRepository<S> sessionRepository,
        ReactiveFindByIndexNameSessionRepository<S> indexedSessionRepository) {
    return new SpringSessionBackedReactiveSessionRegistry<>(sessionRepository, indexedSessionRepository);
}

请参考 Spring Security 并发会话控制文档,了解更多使用ReactiveSessionRegistry. 你也可以在这里查看一份示例申请。spring-doc.cadn.net.cn