springboot webflux 过滤器(WebFilter)

  • Post author:
  • Post category:其他




springboot webflux 过滤器(WebFilter)


************************



相关类与接口



WebFilter

public interface WebFilter {
    Mono<Void> filter(ServerWebExchange var1, WebFilterChain var2);
}



WebFilterChain

public interface WebFilterChain {
    Mono<Void> filter(ServerWebExchange var1);
}



DefaultWebFilterChain

public class DefaultWebFilterChain implements WebFilterChain {
    private final List<WebFilter> allFilters;
    private final WebHandler handler;
    @Nullable
    private final WebFilter currentFilter;
    @Nullable
    private final DefaultWebFilterChain chain;

    public DefaultWebFilterChain(WebHandler handler, List<WebFilter> filters) {
        Assert.notNull(handler, "WebHandler is required");
        this.allFilters = Collections.unmodifiableList(filters);
        this.handler = handler;
        DefaultWebFilterChain chain = initChain(filters, handler);
        this.currentFilter = chain.currentFilter;
        this.chain = chain.chain;
    }

    private static DefaultWebFilterChain initChain(List<WebFilter> filters, WebHandler handler) {
        DefaultWebFilterChain chain = new DefaultWebFilterChain(filters, handler, (WebFilter)null, (DefaultWebFilterChain)null);

        for(ListIterator iterator = filters.listIterator(filters.size()); iterator.hasPrevious(); chain = new DefaultWebFilterChain(filters, handler, (WebFilter)iterator.previous(), chain)) {
        }

        return chain;
    }

    private DefaultWebFilterChain(List<WebFilter> allFilters, WebHandler handler, @Nullable WebFilter currentFilter, @Nullable DefaultWebFilterChain chain) {
        this.allFilters = allFilters;
        this.currentFilter = currentFilter;
        this.handler = handler;
        this.chain = chain;
    }

    public List<WebFilter> getFilters() {
    public WebHandler getHandler() {


    public Mono<Void> filter(ServerWebExchange exchange) {
        return Mono.defer(() -> {
            return this.currentFilter != null && this.chain != null ? this.invokeFilter(this.currentFilter, this.chain, exchange) : this.handler.handle(exchange);
        });
    }

    private Mono<Void> invokeFilter(WebFilter current, DefaultWebFilterChain chain, ServerWebExchange exchange) {
        String currentName = current.getClass().getName();
        return current.filter(exchange, chain).checkpoint(currentName + " [DefaultWebFilterChain]");
    }
}


************************



示例



******************



filter 层



CustomWebFilter

@Component
public class CustomWebFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
        PathPattern pattern=new PathPatternParser().parse("/hello/**");
        ServerHttpRequest request=serverWebExchange.getRequest();

        if (pattern.matches(request.getPath().pathWithinApplication())){
            System.out.println("custom webFilter");
        }

        return webFilterChain.filter(serverWebExchange);
    }
}



******************



controller 层



HelloController

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return "hello world";
    }
}


************************



使用测试



localhost:8080/hello,控制台输出:

2020-06-21 10:33:51.035  INFO 14892 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8080
2020-06-21 10:33:51.045  INFO 14892 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 1.349 seconds (JVM running for 1.94)
custom webFilter



版权声明:本文为weixin_43931625原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。