基本使用

@Bean
public Filter addHeaderFilter() {
    return new Filter() {
        @Override
        public CompletionStage<Void> doFilter(FilterContext context, FilterChain chain) {
            context.request().headers().set("foo", "bar");
            return chain.doFilter(context);
        }
    };
}

上面的例子将会给所有到来的请求都加上一个固定的Header。

异步Filter

@Bean
public Filter filter() {
    return new Filter() {
        @Override
        public CompletionStage<Void> doFilter(FilterContext context, FilterChain chain) {
            return CompletableFuture.runAsync(() -> {
                // do something...
            }).thenCompose(r -> {
                // invoke next filter
                return chain.doFilter(context);
            });
        }
    };
}

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

终止Filter的执行

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

@Override
public CompletableFuture<Void> doFilter(FilterContext context, FilterChain chain) {
    return CompletableFuture.completedFuture(null);
}