Spring Cloud Gateway 默认限流触发时抛出 RateLimitException 但返回 500 或空白响应,需通过 @RestControllerAdvice 拦截该异常并用 ServerResponse 返回 HTTP 429 JSON 响应,同时注意异常优先级、Redis 依赖及 Retry-After 头设置。

Spring Cloud Gateway 默认在限流触发时会抛出 RateLimitException,但默认响应是 500 错误页或空白响应,无法直接返回标准的 HTTP 429(Too Many Requests)。要自定义返回 429 状态码,核心思路是捕获该异常并统一处理为 JSON 响应。
配置全局异常处理器拦截 RateLimitException
Gateway 基于 WebFlux,需使用 @ControllerAdvice 配合 @ExceptionHandler 捕获响应式异常。注意:必须确保该类被 Spring 扫描到,且方法返回 Mono<serverresponse></serverresponse>。
- 创建一个全局异常处理类,添加
@RestControllerAdvice注解 - 编写方法处理
RateLimitException,用ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)构建响应 - 推荐返回 JSON 格式(如
{"code":429,"msg":"Request rate limit exceeded"}),便于前端识别
确保限流过滤器抛出的是 RateLimitException
不同限流实现(如 RedisRateLimiter、RequestRateLimiter)默认行为略有差异。以官方 RedisRateLimiter 为例,它内部确实会抛出 RateLimitException,但前提是配置了正确的限流策略且 Redis 连通正常。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 检查
application.yml中是否启用了限流过滤器,例如:- name: RequestRateLimiter, args: {redis-rate-limiter.replenishRate: 10, redis-rate-limiter.burstCapacity: 20} - 确认项目中引入了
spring-cloud-starter-gateway和spring-boot-starter-data-redis-reactive - 若使用自定义限流器,需主动
throw new RateLimitException("..."),否则异常类型不匹配
避免被默认错误页面覆盖
WebFlux 的默认错误处理机制(如 ErrorWebExceptionHandler)可能抢先处理异常,导致自定义 @ExceptionHandler 不生效。
立即学习“Java免费学习笔记(深入)”;
- 可通过自定义
ErrorWebExceptionHandlerBean 替换默认实现,并在其中判断异常类型,委托给你的逻辑 - 更轻量的方式:在异常处理器中明确指定
@Order(Ordered.HIGHEST_PRECEDENCE)提升优先级 - 验证方式:启动时查看日志是否打印 “Using custom ErrorWebExceptionHandler” 或类似提示
补充:前端友好响应头(可选)
HTTP 429 建议携带 Retry-After 响应头,告知客户端何时可重试。可在异常处理逻辑中动态计算并设置:
- 若限流器支持(如 RedisRateLimiter 提供剩余窗口时间),可从异常上下文或 Redis key TTL 中获取
- 简单场景下可固定返回
Retry-After: 1(单位为秒) - 用
ServerResponse.status(...).header("Retry-After", "1").bodyValue(...)设置

















