【Zuul】Route Filter 修改路由規則

背景

開放平臺對外的接口,都須要有特定的規則,因此在接口路徑設計上,有別於項目中的默認路由規則,因此有對路由進行特殊處理的需求;java

例如:
- 默認路由規則
/userApi/**   --> userService 的服務(https:/xxxx:7777/user)
eg: 
	(網關)https://xxxx:8888/userApi/user/getUser?id=xxx
 		--->
 	(userService)https://xxxx:7777/user/getUser?id=xxx


要實現的對外接口路由規則:
	(網關)https://xxxx:8888/openApi/base/getUser?id=xxx
		--->
	(userService)https://xxxx:7777/user/getUser?id=xxx

實現方式

  1. 路由規則添加 : /openApi/** -> userServicespring

  2. 添加 網關路由攔截器 :ide

    該攔截器在服務進行路由以前執行,因此修改this

    RequestContext ctx = RequestContext.getCurrentContext();
    	HttpServletRequest request = ctx.getRequest();
    	String url = request.getRequestURI();

    requestURI參數,就能夠達到指定服務的路由地址修改;url

OpenApiRouteFilter

package cn.crongl.gateway.filter.route;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

[@Component](https://my.oschina.net/u/3907912)
public class OpenApiRouteFilter extends ZuulFilter {
	private final Logger logger = LoggerFactory.getLogger("OpenApiRouteFilter") ;

	private static String OPEN_API_PRE = "openApi";

	[@Override](https://my.oschina.net/u/1162528)
	public boolean shouldFilter() {
		return true;
	}

	[@Override](https://my.oschina.net/u/1162528)
	public Object run() throws ZuulException {
		RequestContext ctx = RequestContext.getCurrentContext();
		HttpServletRequest request = ctx.getRequest();
		String url = request.getRequestURI();

		//開放平臺接口請求路徑轉換
		if(url.contains(OPEN_API_PRE)){
			this.logger.info("開放接口地址路徑:{}",url);
			url=url.replaceFirst(OPEN_API_PRE, "customer");// 根據配置好的去將url替換掉,這裏能夠寫本身的轉換url的規則
			ctx.put(FilterConstants.REQUEST_URI_KEY, url); // 將替換掉的url set進去,在對應的轉發請求的url就會使用這個url
			this.logger.info("開放接口路徑轉換爲:{}",url);
		}
		return null;
	}

	[@Override](https://my.oschina.net/u/1162528)
	public String filterType() {
		return FilterConstants.ROUTE_TYPE;
	}

	[@Override](https://my.oschina.net/u/1162528)
	public int filterOrder() {
		// TODO Auto-generated method stub
		return 10;
	}


	public static void main(String[] args) {
		String url = "http://123.123.123.123:8888/openApi/base/token?aaa=xxxx";
		if(url.contains(OPEN_API_PRE)){
			url=url.replaceFirst(OPEN_API_PRE, OPEN_API_PRE.concat("/customer"));// 根據配置好的去將url替換掉,這裏能夠寫本身的轉換url的規則
			System.out.println(url);
		}
	}

}
相關文章
相關標籤/搜索