Skip to content

Conversation

@ljluestc
Copy link

问题描述

Spring Cloud Gateway 过滤器(如 StripPrefix=1)和自定义 AbstractGatewayFilterFactory 实现无法正常工作。调试显示网关路由未被执行,导致所有过滤器失效。

根本原因

SaToken 的 SaReactorFilter 在 Spring Cloud Gateway 处理其路由和过滤器之前拦截了所有请求(/**)。这阻止了网关的内部过滤器链执行,使得所有网关过滤器(包括内置的 StripPrefix)失效。

解决方案

修改 SaTokenConfig.java 以排除网关路由路径,使其不受 SaReactorFilter 拦截,从而让 Spring Cloud Gateway 过滤器正常工作。同时创建了示例自定义过滤器来演示 AbstractGatewayFilterFactoryGatewayFilter 的实现。

更改内容

1. 修复 SaToken 配置

文件: mall-gateway/src/main/java/com/macro/mall/config/SaTokenConfig.java

  • 修改 getSaReactorFilter() 方法以排除网关路由不受 SaToken 拦截
  • 添加硬编码的排除列表,包含所有网关路由路径:/mall-auth/**/mall-admin/**/mall-portal/**/mall-search/**/mall-demo/**
  • 这允许 Spring Cloud Gateway 的路由和过滤器链正常执行

2. 创建自定义网关过滤器

文件: mall-gateway/src/main/java/com/macro/mall/filter/LoggingGatewayFilterFactory.java

  • 演示具有可配置参数的 AbstractGatewayFilterFactory
  • 包含具有 preLoggerpostLogger 布尔选项的 Config
  • 在处理前记录请求路径/方法,在处理后记录响应状态

文件: mall-gateway/src/main/java/com/macro/mall/filter/SimpleLoggingFilter.java

  • 演示直接 GatewayFilter 实现
  • 向请求添加自定义头(X-Gateway-FilteredX-Request-Time
  • 记录请求处理和计时信息

3. 更新网关配置

文件: mall-gateway/src/main/resources/application.yml

  • mall-portal 路由过滤器中添加 LoggingGatewayFilterFactory
  • 现在同时包含 StripPrefix=1 和自定义日志过滤器

4. 修复编译问题

  • @Slf4j 注解替换为使用 LoggerFactory.getLogger() 的手动日志器创建
  • 这避免了构建环境中 Lombok 注解处理的问题

5. 添加单元测试

文件: mall-gateway/src/test/java/com/macro/mall/filter/LoggingGatewayFilterFactoryTest.java

  • 测试工厂创建和配置设置器
  • 使用模拟请求测试过滤器执行

文件: mall-gateway/src/test/java/com/macro/mall/filter/SimpleLoggingFilterTest.java

  • 测试不同 HTTP 方法的过滤器执行
  • 测试头保留和自定义头添加
  • 测试错误处理场景

@BlueLeer
Copy link

BlueLeer commented Nov 23, 2025 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants