zuul实现所有接口对于带指定前缀和不带前缀的url均能兼容访问

本文介绍了如何利用Zuul实现所有接口对于带/zuul前缀和不带前缀的URL兼容访问。通过分析Zuul的源码,特别是PreDecorationFilter和SimpleRouteLocator,揭示了Zuul如何处理URL前缀。文中详细解释了ZuulServlet、DispatcherServlet的角色以及如何通过自定义过滤器扩展Zuul以满足特定的路径处理需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们的项目里通过zuul实现路由转发,前几日接到这么一个需求,需要实现所有接口对于带指定前缀和不带前缀的url均能兼容访问,网上这方面的文档并不多,因此为了处理这个需求,捎带着阅读了一下zuul的部分源码
首先说一下结论,zuul本身便实现了这个功能,对于带/zuul的前缀的url会自动去掉该前缀进行转发,完美匹配这次需求。
接着开始理解源码,看一看zuul是怎么实现的。
在springboot项目中使用zuul需要使用@EnableZuulServer或@EnableZuulProxy中的至少一个注解。其中@EnableZuulServer对应ZuulServerAutoConfiguration,@EnableZuulProxy对应ZuulProxyAutoConfiguration,ZuulServerAutoConfiguration是ZuulProxyAutoConfiguration的父类,因此可以简单理解成@EnableZuulServer是@EnableZuulProxy的一个简化版本。
如下图:EnableZuulServer --> ZuulServerMarkerConfiguration --> ZuulServerAutoConfiguration,EnableZuulProxy也类似。
EnableZuulServer

ZuulServerMarkerConfiguration
ZuulServerAutoConfiguration

在这里主要针对EnableZuulProxy展开,我们开一下zuul是怎么针对请求的url进行处理的。
在ZuulProxyAutoConfiguration类中,我们注入了PreDecorationFilter进行拦截。

// pre filters
@Bean
public PreDecorationFilter preDecorationFilter(RouteLocator routeLocator, ProxyRequestHelper proxyRequestHelper) {
	return new PreDecorationFilter(routeLocator, this.server.getServlet().getServletPrefix(), this.zuulProperties,
			proxyRequestHelper);
}

进入这个类我们可以看到该filter的类型是pre,如果已经处理过转发逻辑的请求在不在拦截处理。

@Override
public int filterOrder() {
	return PRE_DECORATION_FILTER_ORDER; //5
}

@Override
public String filterType() {
	return PRE_TYPE;
}

@Override
public boolean shouldFilter() {
	RequestContext ctx = RequestContext.getCurrentContext();
	return !ctx.containsKey(FORWARD_TO_KEY) // a filter has already forwarded
			&& !ctx.containsKey(SERVICE_ID_KEY); // a filter has already determined serviceId
}

接下来我们进入run方法仔细了解PreDecorationFilter的拦截逻辑。

@Override
public Object run() {
	//1.根据请求的url找到对应的路由Route
	RequestContext ctx = RequestContext.getCurrentContext();
	final String requestURI = this.urlPathHelper.getPathWithinApplication(ctx.getRequest());
	Route route = this.routeLocator.getMatchingRoute(requestURI);
	//2.根据Route进行相应的转发
	if (route != null) {
		String location = route.getLocation();
		if (location != null) {
			ctx.put(REQUEST_URI_KEY, route.getPath());
			ctx.put(PROXY_KEY, route.getId());
			if (!route.isCustomSensitiveHeaders()) {
				this.proxyRequestHelper
						.addIgnoredHeaders(this.properties.getSensitiveHeaders().toArray(new String[0]));
			}
			else {
				this.proxyRequestHelper.addIgnoredHeaders(rout
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值