Spring Cloud Gateway SaveSession Filter消失原因及替代方案咨询
Spring Cloud Gateway 2025.0.0(WebMVC)中SaveSession过滤器移除原因及替代方案
一、SaveSession过滤器被移除的原因
Spring Cloud Gateway 2025.0.0对应的WebMVC版本(spring-cloud-gateway-server-mvc 4.3.0)对过滤器体系做了重构,原有的SaveSession过滤器是为旧版WebMVC适配或WebFlux场景设计的,在新的WebMVC网关实现中被移除,核心原因有两点:
- WebMVC原生会话管理机制已与Spring Security、Gateway流程深度整合,OAuth2认证/授权过程中,Spring Security会自动触发会话状态保存,无需显式调用SaveSession强制触发。
- 新的WebMVC网关过滤器采用了贴合Spring WebMvc.fn的
HandlerFilterFunction接口设计,旧的SaveSession过滤器不符合新接口规范,因此被废弃移除。
二、替代方案
1. 普通场景(不使用Spring Session)
直接移除配置中的SaveSession即可,OAuth2会话管理会正常工作:
spring.cloud.gateway.server.webmvc: [...] filters: - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin - TokenRelay= - StripPrefix=1
Spring Security在处理完OAuth2授权码流程、令牌刷新等操作后,会自动将会话状态写入HttpSession,无需额外配置。
2. Spring Session场景(会话缓存到Redis/数据库等)
如果后续要引入Spring Session实现分布式会话,按以下步骤配置即可,无需额外Gateway过滤器:
步骤1:引入依赖
以Redis存储为例,在pom.xml中添加Spring Session相关依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
步骤2:配置Spring Session
在application.yml中指定会话存储类型:
spring: session: store-type: redis redis: flush-mode: on_save # 可根据需求调整会话刷新模式
步骤3:会话自动持久化逻辑
Spring Session会自动拦截所有请求,当HttpSession中的数据发生变更时(比如OAuth2认证后写入的用户信息、令牌信息),会自动将会话数据同步到Redis(或其他存储介质)。Spring Security的会话操作会自动触发该同步流程,无需额外Gateway过滤器。
特殊场景:强制触发会话保存
如果有自定义场景需要强制保存会话(比如写入自定义会话属性后),可以自定义一个HandlerFilterFunction:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.function.HandlerFilterFunction; import org.springframework.web.servlet.function.ServerRequest; import org.springframework.web.servlet.function.ServerResponse; import javax.servlet.http.HttpSession; @Configuration public class GatewayFilterConfig { @Bean public HandlerFilterFunction<ServerResponse, ServerResponse> customSaveSessionFilter() { return (request, next) -> { return next.handle(request) .doOnSuccess(response -> { // 获取当前会话(不存在则不创建) HttpSession session = request.exchange().getRequest().getSession(false); if (session != null) { // 触发会话变更,Spring Session会自动持久化 session.setAttribute("last_updated", System.currentTimeMillis()); } }); }; } }
该自定义过滤器会在请求处理完成后触发会话变更检测,让Spring Session自动持久化会话数据。
三、验证要点
- 启动应用后,访问需要认证的接口,检查Spring Session存储(比如Redis中的
spring:session:*键)是否存在会话数据。 - 验证TokenRelay过滤器正常工作,后端REST API能收到正确的OAuth2令牌。
- 测试跨域配置,确保Angular前端能正确接收并携带会话Cookie。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

