过滤器 Prefix · SpringCloud微服务实战 · 看云
3. 过滤器 Prefix
导航
该
PrefixPath、GatewayFilter工厂采用单个prefix参数
本节代码地址
3.1 应用配置
下面配置中,我们设置了一个路由前缀,会在我们输入的路径前面拼上我们设置的前缀,比如/1将向发送请求/user/1。
server:
port: 8699
spring:
application:
name: fw-gateways-gateway
profiles:
active: prefixpath_route
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
---
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: lb://fw-cloud-ribbon-server
predicates:
- After=2020-01-08T18:30:11.965+08:00[Asia/Shanghai]
filters:
- PrefixPath= /user
profiles: prefixpath_route
3.2 应用启动
浏览器或Postman 输入localhost:8699/1
3.3 PrefixPathGatewayFilterFactory源码
刚开始初始化的时候会设置网关是否已设置前缀gatewayAlreadyPrefixed为false,如果已经设置,就会以设置的为主。
修改gatewayAlreadyPrefixed的状态为true,并修改url的地址加上config.prefix中的值,config.prefix的值可以图片。
修改完之后重新构建ServerHttpRequest,之后交给NettyRoutingFilter执行
@Override
public GatewayFilter apply(Config config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange,
GatewayFilterChain chain) {
boolean alreadyPrefixed = exchange
.getAttributeOrDefault(GATEWAY_ALREADY_PREFIXED_ATTR, false);
if (alreadyPrefixed) {
return chain.filter(exchange);
}
exchange.getAttributes().put(GATEWAY_ALREADY_PREFIXED_ATTR, true);
ServerHttpRequest req = exchange.getRequest();
addOriginalRequestUrl(exchange, req.getURI());
String newPath = config.prefix + req.getURI().getRawPath();
ServerHttpRequest request = req.mutate().path(newPath).build();
exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, request.getURI());
if (log.isTraceEnabled()) {
log.trace("Prefixed URI with: " + config.prefix + " -> "
+ request.getURI());
}
return chain.filter(exchange.mutate().request(request).build());
}
@Override
public String toString() {
return filterToStringCreator(PrefixPathGatewayFilterFactory.this)
.append("prefix", config.getPrefix()).toString();
}
};
}

