You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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网关实现中被移除,核心原因有两点:

  1. WebMVC原生会话管理机制已与Spring Security、Gateway流程深度整合,OAuth2认证/授权过程中,Spring Security会自动触发会话状态保存,无需显式调用SaveSession强制触发。
  2. 新的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:16:12