return chain.filter(exchange)
.then(Mono.fromRunnable(() -> {
// Post-processing
if (config.isPostLogger()) {
logger.info("Post GatewayFilter logging: "
- config.getBaseMessage());
}
}));
};
}
4.2 用配置注册GatewayFilter
现在,我们可以轻松地将过滤器注册到我们先前在应用程序属性中定义的路由:
…
filters:
-
RewritePath=/service(?/?.*), ${segment}
-
name: Logging
args:
baseMessage: My Custom Message
preLogger: true
postLogger: true
我们只需要指出配置参数即可。这里重要的一点是,我们需要在LoggingGatewayFilterFactory.Config 类中配置无参数的构造函数和设置器,此方法才能正常工作。
如果我们想使用紧凑表示法配置过滤器,则可以执行以下操作:
filters:
-
RewritePath=/service(?/?.*), ${segment}
-
Logging=My Custom Message, true, true
我们需要对工厂进行一些调整。简而言之,我们必须重写_shortcutFieldOrder_方法,以指示快捷方式属性将使用的顺序和多少个参数:
@Override
public List shortcutFieldOrder() {
return Arrays.asList(“baseMessage”,
“preLogger”,
“postLogger”);
}
4.3 GatewayFilter顺序
如果要配置过滤器在过滤器链中的位置,可以从 AbstractGatewayFilterFactory#apply 方法而不是简单的lambda表达式中检索 OrderedGatewayFilter实例:
@Override
public GatewayFilter apply(Config config) {
return new OrderedGatewayFilter((exchange, chain) -> {
// …
}, 1);
}
4.4 以编程方式注册GatewayFilter
此外,我们也可以通过编程方式注册过滤器。让我们通过设置_RouteLocator_ bean重新定义我们一直在使用的路由:
@Bean
public RouteLocator routes(
RouteLocatorBuilder builder,
LoggingGatewayFilterFactory loggingFactory) {
return builder.routes()
.route(“service_route_java_config”, r -> r.path(“/service/**”)
.filters(f ->
f.rewritePath(“/service(?/?.*)”, “$\{segment}”)
.filter(loggingFactory.apply(
new Config(“My Custom Message”, true, true))))
.uri(“http://localhost:8081”))
.build();
}