文章背景图

Spring-Cloud-Gateway 源码解析 —— 处理器 (3.3) 之 FilteringWebHandler 创建过滤器链

2026-01-31
1
-
- 分钟
|

摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/handler-filtering-web-handler/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 Spring-Cloud-Gateway 2.0.X M4

阅读源码最好的方式,是使用 IDEA 进行调试 Spring Cloud Gateway 源码,不然会一脸懵逼。

1. 概述

本文主要分享 FilteringWebHandler

《Spring-Cloud-Gateway 源码解析 —— 处理器 (3.2) 之 RoutePredicateHandlerMapping 路由匹配 》「2.1 SimpleHandlerAdapter」 里,我们看到 SimpleHandlerAdapter#handle(ServerWebExchange, Object) 调用 FilteringWebHandler#handle(ServerWebExchange) 方法,处理请求。

FilteringWebHandler 通过创建请求对应的 Route 对应的 GatewayFilterChain 进行处理。

01-QXYXrGdOHNfMeXONhoMMKHhPjKfpYaVD-puTrYMLsMfBsvLqoXGXeJWTUqYrTaLWu.jpeg

推荐 Spring Cloud 书籍

2. FilteringWebHandler

org.springframework.cloud.gateway.handler.FilteringWebHandler#handle(ServerWebExchange) 代码如下 :

public class FilteringWebHandler implements WebHandler {

	/**
	 * 全局过滤器
	*/
	private final List<GatewayFilter> globalFilters;

	@Override
	public Mono<Void> handle(ServerWebExchange exchange) {
	    // 获得 Route
		Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
		// 获得 GatewayFilter
		List<GatewayFilter> gatewayFilters = route.getFilters();
		List<GatewayFilter> combined = new ArrayList<>(this.globalFilters);
		combined.addAll(gatewayFilters);

		// 排序
		//TODO: needed or cached?
		AnnotationAwareOrderComparator.sort(combined);
		logger.debug("Sorted gatewayFilterFactories: "+ combined);

		// 创建 DefaultGatewayFilterChain
		return new DefaultGatewayFilterChain(combined).filter(exchange);
	}
}

评论交流

文章目录