常见配置
本节包含适用于所有或大多数春季会话模块的常见配置。 它包含以下用例的配置示例:
更改会话ID的生成方式
默认情况下,春季会话使用UuidSessionIdGenerator而该 又使用 一个java.util.UUID生成会话ID。
有些情况下,可能更适合加入其他角色以增加熵,或者你可能想用不同的算法生成会话ID。
要改变这一点,你可以提供自定义SessionIdGenerator豆:
-
Java
@Bean
public SessionIdGenerator sessionIdGenerator() {
return new MySessionIdGenerator();
}
class MySessionIdGenerator implements SessionIdGenerator {
@Override
public String generate() {
// ...
}
}
在暴露你的SessionIdGeneratorBean,Spring Session 会用它来生成会话 ID。
如果你是手动配置会话仓库豆子(代替使用@EnableRedisHttpSession例如,你可以设置SessionIdGenerator直接在会话仓库实现:
SessionIdGenerator直接进入会话仓库实现-
Java
@Bean
public RedisSessionRepository redisSessionRepository(RedisOperations redisOperations) {
RedisSessionRepository repository = new RedisSessionRepository(redisOperations)
repository.setSessionIdGenerator(new MySessionIdGenerator());
return repository;
}
定制会话Cookie
设置好春季会话后,你可以通过公开CookieSerializer作为春豆。
春季课程包含默认Cookie序列化器.
揭露默认Cookie序列化器因为 Spring Bean 在使用以下配置时对现有配置进行了补充@EnableRedisHttpSession.
以下示例展示了如何自定义春季课程的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:用来用的饼干名称。 违约:会期. -
使用SecureCookie: 指定是否应使用安全Cookie。默认:使用值HttpServletRequest.isSecure()在创造时期。 -
cookiePath(cookie路径):cookie的路径。默认:上下文根。 -
cookieMaxAge: 指定会话创建时 cookie 的最大年龄。 违约:-1,这表示浏览器关闭时应移除该 cookie。 -
jvm路线: 指定一个后缀要附加在会话 ID 后并包含在 Cookie 中。用于识别应路由哪个 JVM 以实现会话亲和性。在某些实现(如 Redis 中),该选项不带来性能提升。但它可以帮助追踪特定用户的日志。 -
域名: 允许指定用于 cookie 的特定域名。该选项易于理解,但通常需要开发环境和生产环境之间的不同配置。 看域名模式作为替代方案。 -
域名模式:用于从中提取域名的大小写不区分模式HttpServletRequest#getServerName(). 该模式应提供单一分组,用于提取 cookie 域的值。如果正则表达式不匹配,则不设置域,使用现有域。如果正则表达式匹配,则使用第一个分组作为域。 -
同址:同站cookie 指令。以禁用序列化同站Cookie 指令,你可以将此值设置为零. 违约:宽松 -
rememberMeRequestAttribute: 请求属性名称,表示“记住我”登录。如果指定,Cookie将写成Integer.MAX价值.
|
如果你正在使用 |
WebFlux中的自定义Cookie
你可以通过在WebFlux应用中自定义会话Cookie的编写方式,通过暴露WebSessionIdResolver作为春季豆。春季会话使用CookieWebSessionIdResolver默认情况下。以下示例展示了如何自定义 Spring Session 的 cookie:
@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 Session 与 Spring Security 集成,以支持其响应式并发会话控制。这允许限制单个用户同时拥有的活跃会话数量,但与默认的 Spring Security 支持不同,这也适用于集群环境。这通过提供SpringSessionBackedReactiveSessionRegistrySpring Security 的实现ReactiveSessionRegistry接口。
-
Java
@Bean
public <S extends Session> SpringSessionBackedReactiveSessionRegistry<S> sessionRegistry(
ReactiveSessionRepository<S> sessionRepository,
ReactiveFindByIndexNameSessionRepository<S> indexedSessionRepository) {
return new SpringSessionBackedReactiveSessionRegistry<>(sessionRepository, indexedSessionRepository);
}
请参考 Spring Security 并发会话控制文档,了解更多使用ReactiveSessionRegistry. 你也可以在这里查看一份示例申请。