1. 概述
本文主要分享 FilteringWebHandler。
在 《Spring-Cloud-Gateway 源码解析 —— 处理器 (3.2) 之 RoutePredicateHandlerMapping 路由匹配 》「2.1 SimpleHandlerAdapter」 里,我们看到 SimpleHandlerAdapter#handle(ServerWebExchange, Object)
调用 FilteringWebHandler#handle(ServerWebExchange)
方法,处理请求。
FilteringWebHandler 通过创建请求对应的 Route 对应的 GatewayFilterChain 进行处理。
2. FilteringWebHandler
org.springframework.cloud.gateway.handler.FilteringWebHandler
,#handle(ServerWebExchange)
代码如下 :
1: public class FilteringWebHandler implements WebHandler {
2:
3: /**
4: * 全局过滤器
5: */
6: private final List<GatewayFilter> globalFilters;
7:
8: @Override
9: public Mono<Void> handle(ServerWebExchange exchange) {
10: // 获得 Route
11: Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
12: // 获得 GatewayFilter
13: List<GatewayFilter> gatewayFilters = route.getFilters();
14: List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
15: combined.addAll(gatewayFilters);
16:
17: // 排序
18: //TODO: needed or cached?
19: AnnotationAwareOrderComparator.sort(combined);
20: logger.debug("Sorted gatewayFilterFactories: "+ combined);
21:
22: // 创建 DefaultGatewayFilterChain
23: return new DefaultGatewayFilterChain(combined).filter(exchange);
24: }
25: }
- 本方法涉及到的过滤器 GlobalFilter / GatewayFilter / GatewayFilterAdapter / OrderedGatewayFilter 类,我们在 《Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.1) 之 GatewayFilter 一览》 详细解析。
- 本方法涉及到的过滤器链 GatewayFilterChain / DefaultGatewayFilterChain 类,我们在 《Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.1) 之 GatewayFilter 一览》 详细解析。
- 第 11 行 :从
GATEWAY_ROUTE_ATTR
获得 请求对应的 Route 。 - 第 13 至 15 行 :获得 GatewayFilter 数组,包含
route.filters
和globalFilters
。 - 第 19 行 :排序获得的 GatewayFilter 数组。
- 第 23 行 :使用获得的 GatewayFilter 数组创建 DefaultGatewayFilterChain ,过滤处理请求。