Skip to content

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

补充教学 —— 为什么要强制修改状态码?

通常情况下,我们希望原原本本地透传下游服务的状态码。但在某些特殊场景下,我们需要“欺骗”前端或掩盖真实错误:

  1. 统一错误页面类型

    • 下游服务可能返回各种奇奇怪怪的错误码(如 418 I'm a teapot)。
    • 为了兼容一些老旧的客户端逻辑,你可能需要统一把某些错误转换为 400 Bad Request500 Internal Server Error
  2. 降级与回退(Fallback)

    • 当你从 CircuitBreaker 的 fallback 页面返回静态内容时,如果不做处理,状态码可能还是 200 OK。
    • 为了让监控系统或前端明确知道“这是个错误(虽然我们返回了友好的界面)”,你可以强制 SetStatus=503
  3. 保留现场(original-status-header-name)

    • 当你强制修改了状态码后(比如把 500 改成了 200),你就丢失了“到底刚才发生了什么错误”的信息。
    • 配置 original-status-header-name: original-http-status 后,网关会在 Header 里偷偷塞一张小纸条:“嘿,虽然我现在告诉你 200 OK,但其实刚才那家伙回的是 404 哦。”

Based on Spring Framework.