Spring Boot/Spring Webflux如何设置会话超时及配置不生效排查
问题原因
- 核心触发点是项目中使用了
@EnableWebFlux注解。Spring Boot的WebFluxAutoConfiguration自动配置类带有@ConditionalOnMissingBean(WebFluxConfigurationSupport.class)条件,只有容器中不存在该类型Bean时,自动配置才会生效。 - 添加
@EnableWebFlux后,Spring会自动导入DelegatingWebFluxConfiguration,该类是WebFluxConfigurationSupport的子类,直接导致WebFluxAutoConfiguration整体跳过自动装配,和TRACE日志中输出的条件不匹配信息完全对应。 - 负责读取
server.reactive.session.timeout配置、生成带超时逻辑WebSessionManager的Bean定义属于WebFluxAutoConfiguration内部,自动配置跳过后该Bean不会被实例化,容器会使用默认无自定义超时的WebSessionManager实现,最终导致配置的10秒会话超时不生效。
正确配置方案
方案1:移除@EnableWebFlux注解(官方推荐)
Spring Boot默认已经完成WebFlux的全套自动装配,不需要手动添加@EnableWebFlux。该注解的作用是完全关闭Spring Boot对WebFlux的自动适配,完全由开发者手动接管所有WebFlux相关配置,绝大多数场景下不需要使用。
- 直接删除项目中所有类上的
@EnableWebFlux注解 - 如果需要自定义WebFlux配置(比如跨域、参数解析、静态资源映射等),编写配置类实现
WebFluxConfigurer接口即可,该方式不会打断Spring Boot的自动配置,示例代码如下:
@Configuration public class CustomWebFluxConfig implements WebFluxConfigurer { // 按需重写需要自定义的配置方法即可 @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedMethods("GET", "POST") .allowedOrigins("*"); } }
操作完成后重启项目,application.properties中配置的server.reactive.session.timeout=10s会被自动读取,会话超时逻辑正常生效。
方案2:保留@EnableWebFlux时手动注册WebSessionManager
如果确实需要使用@EnableWebFlux完全接管WebFlux配置,需要手动将WebSessionManager注册到容器中,手动绑定超时配置,示例代码如下:
@Configuration @EnableWebFlux public class FullControlWebFluxConfig implements WebFluxConfigurer { @Bean public WebSessionManager webSessionManager(ObjectProvider<WebSessionIdResolver> webSessionIdResolver, ServerProperties serverProperties) { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); // 读取配置文件中的会话超时参数 Duration sessionTimeout = serverProperties.getReactive().getSession().getTimeout(); sessionManager.setSessionStore(new MaxIdleTimeInMemoryWebSessionStore(sessionTimeout)); webSessionIdResolver.ifAvailable(sessionManager::setSessionIdResolver); return sessionManager; } // 其余自定义WebFlux配置按需添加 }
该方式下配置文件中的server.reactive.session.timeout参数同样可以正常生效。
注意:WebFlux的会话超时是最大空闲超时,即会话在连续指定时长内没有被访问才会触发过期,不是从会话创建开始计算的固定存活时长。
内容的提问来源于stack exchange,提问作者Shy Albatross
相关产品推荐
相关产品推荐

