Skip to content

在Spring Cloud Gateway中,请求和响应的处理是通过不同的过滤器机制实现的。让我来解释这两个过滤器是如何区分处理请求和响应阶段的:

RequestValidationFilter(请求过滤器)

  1. 处理阶段:这是请求进入网关时的预处理阶段,即客户端发送请求到网关,网关将其转发给下游服务之前。

  2. 主要职责

    • 验证请求参数签名
    • 解密请求体(如果需要)
    • 验证和解析用户Token
    • 限流控制
    • 设置跟踪ID和其他上下文信息
  3. 关键实现

    • 实现了GlobalFilter接口,处理所有进入的请求
    • 通过[decorateHead()](file://D:\Java_projects\damai\damai-server\damai-gateway-service\src\main\java\com\damai\filter\RequestValidationFilter.java#L367-L403)方法修改请求头和请求体
    • 在请求转发给下游服务前完成所有验证工作

ResponseValidationFilter(响应过滤器)

  1. 处理阶段:这是响应返回阶段,即下游服务返回结果给网关,网关再将其返回给客户端之前。

  2. 主要职责

    • 加密响应数据(如果需要)
    • 修改响应体内容
    • 处理响应头
  3. 关键实现

    • 也实现了GlobalFilter接口,处理所有响应
    • 通过扩展ServerHttpResponseDecorator来拦截和修改响应
    • 重写了writeWith()方法来处理响应体

两者的主要区别

方面RequestValidationFilterResponseValidationFilter
处理时机请求进入网关时响应离开网关时
继承/实现GlobalFilter, OrderedGlobalFilter, Ordered
装饰对象ServerHttpRequestDecoratorServerHttpResponseDecorator
核心方法filter()filter(), writeWith()
主要任务验证请求、解析Token、限流加密响应数据

执行顺序

根据两个过滤器的[getOrder()](file://D:\Java_projects\damai\damai-server\damai-gateway-service\src\main\java\com\damai\filter\RequestValidationFilter.java#L318-L320)方法返回值都是-2,它们具有相同的优先级。在Spring Cloud Gateway中,请求和响应的处理遵循以下流程:

  1. 请求阶段

    • RequestValidationFilter处理请求
    • 执行其他过滤器
    • 将请求转发给下游服务
  2. 响应阶段

    • 下游服务返回响应
    • 执行其他过滤器
    • ResponseValidationFilter处理响应
    • 将响应返回给客户端

这样的设计使请求和响应处理完全分离,各自专注于自己的职责,符合单一职责原则,同时也体现了响应式编程的特点。