在Spring Cloud Gateway中,请求和响应的处理是通过不同的过滤器机制实现的。让我来解释这两个过滤器是如何区分处理请求和响应阶段的:
RequestValidationFilter(请求过滤器)
处理阶段:这是请求进入网关时的预处理阶段,即客户端发送请求到网关,网关将其转发给下游服务之前。
主要职责:
- 验证请求参数签名
- 解密请求体(如果需要)
- 验证和解析用户Token
- 限流控制
- 设置跟踪ID和其他上下文信息
关键实现:
- 实现了
GlobalFilter接口,处理所有进入的请求 - 通过[decorateHead()](file://D:\Java_projects\damai\damai-server\damai-gateway-service\src\main\java\com\damai\filter\RequestValidationFilter.java#L367-L403)方法修改请求头和请求体
- 在请求转发给下游服务前完成所有验证工作
- 实现了
ResponseValidationFilter(响应过滤器)
处理阶段:这是响应返回阶段,即下游服务返回结果给网关,网关再将其返回给客户端之前。
主要职责:
- 加密响应数据(如果需要)
- 修改响应体内容
- 处理响应头
关键实现:
- 也实现了
GlobalFilter接口,处理所有响应 - 通过扩展
ServerHttpResponseDecorator来拦截和修改响应 - 重写了
writeWith()方法来处理响应体
- 也实现了
两者的主要区别
| 方面 | RequestValidationFilter | ResponseValidationFilter |
|---|---|---|
| 处理时机 | 请求进入网关时 | 响应离开网关时 |
| 继承/实现 | GlobalFilter, Ordered | GlobalFilter, Ordered |
| 装饰对象 | ServerHttpRequestDecorator | ServerHttpResponseDecorator |
| 核心方法 | 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中,请求和响应的处理遵循以下流程:
请求阶段:
- RequestValidationFilter处理请求
- 执行其他过滤器
- 将请求转发给下游服务
响应阶段:
- 下游服务返回响应
- 执行其他过滤器
- ResponseValidationFilter处理响应
- 将响应返回给客户端
这样的设计使请求和响应处理完全分离,各自专注于自己的职责,符合单一职责原则,同时也体现了响应式编程的特点。