遇到這么一個面試題:自定義網(wǎng)關(guān)過濾器實現(xiàn)把url中的請求參數(shù)放到http的header中傳遞給微服務(wù)。
我們知道網(wǎng)關(guān)的一個重要的作用就是路由轉(zhuǎn)發(fā),路由表的配置大概是這個樣子:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: http://localhost:8081
predicates:
- Path=/user/*
filters:
- QueryToHeader=authorization,auth
其中的filters就是配置的路由過濾器,Spring已經(jīng)內(nèi)置了31個路由的過濾器,這些過濾器都是org.springframework.cloud.gateway.filter.GatewayFilter
的子類,每一種過濾器都是由一種實現(xiàn)了org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory
接口的過濾器工廠來生成的,比如:
-
AddRequestHeaderGatewayFilterFactory
生成AddRequestHeader
的過濾器 -
AddRequestParameterGatewayFilterFactory
生成AddRequestParameter
的過濾器 -
StripPrefixGatewayFilterFactory
生成StripPrefix
的過濾器.
我們現(xiàn)在就需要自定義一個這樣的路由過濾器,實現(xiàn)把url中的請求參數(shù)放到http的header中傳遞給微服務(wù),比如:
filters:
- QueryToHeader=authorization,auth
首先,我們要寫一個GatewayFilterFactory的實現(xiàn)類,這里我們選擇繼承AbstractGatewayFilterFactory:文章來源:http://www.zghlxwxcb.cn/news/detail-600096.html
@Component
public class QueryToHeaderGatewayFilterFactory extends
AbstractGatewayFilterFactory<QueryToHeaderGatewayFilterFactory.QueryToHeaderConfig> {
public QueryToHeaderGatewayFilterFactory() {
super(QueryToHeaderConfig.class);
}
/**定義路由過濾器的參數(shù)的順序*/
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("queryName", "headerName");
}
@Override
public GatewayFilter apply(final QueryToHeaderConfig config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
// 根據(jù)請求參數(shù)的名字,獲取參數(shù)的值
String queryValue = request.getQueryParams().getFirst(config.getQueryName());
// 如果沒有值,直接放行
if(!StringUtils.hasLength(queryValue)){
return chain.filter(exchange);
}
// 把參數(shù)重新放到header中,header的key是在配置中配置好的
request.mutate().header(config.getHeaderName(), queryValue);
return chain.filter(exchange);
}
};
}
/**封裝路由過濾器的參數(shù)*/
@Validated
public static class QueryToHeaderConfig {
protected @NotEmpty String queryName;
protected @NotEmpty String headerName;
public QueryToHeaderConfig() {
}
public String getQueryName() {
return this.queryName;
}
public QueryToHeaderConfig setQueryName(String queryName) {
this.queryName = queryName;
return this;
}
public String getHeaderName() {
return this.headerName;
}
public QueryToHeaderConfig setHeaderName(String headerName) {
this.headerName = headerName;
return this;
}
@Override
public String toString() {
return (new ToStringCreator(this)).append("headerName", this.headerName).append("queryName", this.queryName).toString();
}
}
}
打開瀏覽器,測試一下,比如輸入:http://localhost:8080/user/2?authorization=456
微服務(wù)中可以從header中讀取到auth的值是456。
源碼下載:https://github.com/xjs1919/enumdemo/tree/master/gateway-filter-demo文章來源地址http://www.zghlxwxcb.cn/news/detail-600096.html
到了這里,關(guān)于Spring-Cloud-Gateway如何自定義路由過濾器?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!