我尝试使用Spring Cloud Gateway过滤器来处理我的请求。我尝试使用一些变体实现过滤器,如下所示:
@Component
@Slf4j
@Order(-10000)
public class CustomFilter extends AbstractGatewayFilterFactory<CustomFilter.Config> {
public CustomFilter() {
super(Config.class);
log.info("Loaded GatewayFilterFactory [Authorize]");
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("enabled");
}
@Override
public ShortcutType shortcutType() {
return ShortcutType.DEFAULT;
}
@Override
public GatewayFilter apply(CustomFilter.Config config) {
log.info("Into apply");
return (exchange, chain)->{
log.info("Into exchange!");
System.out.println(exchange.getRequest() + " request");
return chain.filter(exchange);
};
}
public static class Config {
private boolean enabled;
public Config() {}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
}
Component
@Slf4j
public class MainFilter implements GatewayFilterFactory<MainFilter.Config> {
@Override
public GatewayFilter apply(Config config) {
log.info("[Apply]");
return (exchange, chain) -> {
log.info("[Apply: {}]", exchange);
System.out.println("gateway filter name " + config.getName());
return chain.filter(exchange);
};
}
@Override
public Class<Config> getConfigClass() {
return Config.class;
}
@Override
public Config newConfig() {
return new Config("MainFilter");
}
public static class Config {
public Config(String name) {
this.name = name;
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
我的gateway. yml文件如下:
server:
port: 8080
management:
endpoint:
gateway:
enabled: true
endpoints:
web:
exposure:
include: gateway
spring:
cloud:
discovery:
enabled: true
gateway:
discovery:
locator:
enabled: true
lowerCaseServiceId: true
# default-filters:
# - name: MainFilter
routes:
- id: second_route
uri: lb://auth-service
predicates:
- Path=/api/v1/**
filters:
- MainFilter
application:
loadbalancer:
ribbon:
enabled: false
但当我创建请求服务localhost:8080/auth-service/api/v1/过滤器不工作。我没有看到mwsahe www.example.com()在我的控制台上。但当我使用条件默认过滤器在我的网关。yml我的自定义过滤器工作。什么问题使用自定义过滤器与我的路线?log.info() on my console. But when i use conditions default-filter in my gateway.yml my custom filter is working. What problem for use custom filter with my route?
1条答案
按热度按时间xlpyo6sf1#
过滤器不起作用的原因很可能是传入的请求与配置中的路径 predicate 不匹配
路由配置为
其中MainFilter应用于所有匹配路径 predicate
/api/v1/**
的请求。如果我们更仔细地查看 predicate ,传入请求路径应该:1.从
/api/v1
开始1.在
/api/v1
段之后的url中有任何内容(**
类似于regex.*
表达式,将匹配所有内容)因此,应匹配以下请求URL:
但是当我创建服务请求时localhost:8080/auth-service/API/v1/过滤器不工作
根据上面提供的路径 predicate Map信息,您的请求不应与您定义的路径 predicate 匹配。您的请求具有以下路径
/auth-service/api/v1
,而网关正在查找类似/api/v1/
的路径。由于没有匹配的路由,网关忽略请求并允许它在管道中继续前进,我假设您的auth-service API与Map匹配,并且相应的控制器直接返回响应,而不需要网关
说到默认过滤器,他们将处理所有的请求,无论他们有什么URL/标题/查询。
您应该能够使用以下配置找到路径匹配器日志
然后查找类似以下内容的日志:
Pattern "[/api/v1/**]" does not match against value "/auth-service/api/v1"
Pattern "/api/v1/**" matches against value "/api/v1/"
有关路径 predicate 的其他信息,请访问: