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 Cu

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: