SetStatus GatewayFilter 工厂
SetStatus GatewayFilter 工厂接受一个参数 status。 它必须是一个有效的 Spring HttpStatus。 它可以是整数值 404 或枚举的字符串表示形式 NOT_FOUND。
以下示例配置了一个 SetStatus GatewayFilter:
application.yml
yaml
spring:
cloud:
gateway:
routes:
- id: setstatusstring_route
uri: https://example.org
filters:
- SetStatus=UNAUTHORIZED
- id: setstatusint_route
uri: https://example.org
filters:
- SetStatus=401在任何一种情况下,响应的 HTTP 状态都会被设置为 401。
你可以配置 SetStatus GatewayFilter,使其在响应 Header 中返回从被代理请求(上游服务)获取的原始 HTTP 状态码。 如果配置了以下属性,该 Header 将会被添加到响应中:
application.yml
yaml
spring:
cloud:
gateway:
set-status:
original-status-header-name: original-http-status补充教学 —— 为什么要强制修改状态码?
通常情况下,我们希望原原本本地透传下游服务的状态码。但在某些特殊场景下,我们需要“欺骗”前端或掩盖真实错误:
统一错误页面类型:
- 下游服务可能返回各种奇奇怪怪的错误码(如 418 I'm a teapot)。
- 为了兼容一些老旧的客户端逻辑,你可能需要统一把某些错误转换为
400 Bad Request或500 Internal Server Error。
降级与回退(Fallback):
- 当你从
CircuitBreaker的 fallback 页面返回静态内容时,如果不做处理,状态码可能还是 200 OK。 - 为了让监控系统或前端明确知道“这是个错误(虽然我们返回了友好的界面)”,你可以强制
SetStatus=503。
- 当你从
保留现场(original-status-header-name):
- 当你强制修改了状态码后(比如把 500 改成了 200),你就丢失了“到底刚才发生了什么错误”的信息。
- 配置
original-status-header-name: original-http-status后,网关会在 Header 里偷偷塞一张小纸条:“嘿,虽然我现在告诉你 200 OK,但其实刚才那家伙回的是 404 哦。”