基本使用

@Bean
public RouteFilter addHeaderFilter() {
    return new RouteFilter() {
        @Override
        public CompletionStage<Void> routed(HandlerMapping mapping, RouteContext context, RouteFilterChain next) {
            String handleName;
            if ((handleName = mapping.methodInfo().handlerMethod().method().getName()).equals("get")) {
                context.request().headers().set("handlerName", handleName);
            }
            return next.doNext(mapping, context);
        }
    };
}

上面的例子将会在路由匹配完成后,对所有Handler方法名称为get的方法的请求都加上一个固定的Header。

异步RouteFilter

@Bean
public RouteFilter routeFilter() {
    return new RouteFilter() {
        @Override
        public CompletionStage<Void> routed(HandlerMapping mapping, RouteContext context, RouteFilterChain next) {
            return CompletableFuture.runAsync(() -> {
                // do something...
            }).thenCompose(r -> {
                // invoke next filter
                return next.doNext(mapping, context);
            });
        }
    };
}

上面的例子演示了在routed(xxx, xxx)中进行异步操作,并在该操作完成后回调RouteFilterChain继续执行后续操作。

终止RouteFilter的执行

当不期望执行后续的RouteFilter时可返回一个CompletableFuture.completedFuture(null)实例。

@Override
public CompletionStage<Void> routed(HandlerMapping mapping, RouteContext context, RouteFilterChain next) {
    return CompletableFuture.completedFuture(null);
}