springboot webflux 过滤器(WebFilter)


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

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: Spring Boot WebFlux是Spring Boot框架的一部分,它提供了一种响应式编程模型,可以用于构建高性能、高可伸缩性的Web应用程序。WebFlux基于Reactor框架,它支持异步和非阻塞I/O操作,可以处理大量的并发请求。WebFlux还提供了一些有用的功能,如函数式端点、WebSockets、HTTP/2等。 ### 回答2: Spring Boot WebFlux是Spring Framework 5.0版本中新增的模块,它基于响应式编程的思想,提供了一种非常高效和易于扩展的方式来开发异步非阻塞的Web应用程序。 WebFlux的核心是基于Reactor和Netty的异步IO模型,因此它可以非常高效地处理大量的并发请求。Reactor是一个响应式编程框架,它可以将异步事件流进行处理,并且在需要的时候进行背压流控制,确保应用程序不会因为过多的请求而崩溃或溢出。 在WebFlux中,我们可以使用注解方式来定义RESTful API,并且使用函数式编程方式来处理请求和响应。这种方式非常简洁和高效,可以大大减少重复代码的编写和维护成本。 另外,WebFlux还提供了一些非常强大的功能,例如集成了Spring Security,可以轻松地实现基于角色和权限的访问控制;还提供了Reactive Data Access,可以方便地访问各种数据库、缓存和消息队列等数据源。 在开发Web应用程序时,我们常常会遇到的一个问题是如何处理长连接。在传统的Servlet模型下,我们通常会创建一个新的线程来处理每个连接,这样会导致线程资源的浪费。但是在WebFlux中,我们可以使用WebSocket和Server-Sent Events等技术来处理长连接,这种方式可以在不创建新线程的情况下处理大量的并发连接,大大提高了应用程序的性能和稳定性。 总之,Spring Boot WebFlux是一种非常优秀的Web开发框架,它提供了一种高效、易于扩展和具有优异性能的方式来开发异步非阻塞的Web应用程序。如果你希望开发出高性能、高可用性的Web应用程序,那么WebFlux是一个非常不错的选择。 ### 回答3: Spring Boot Webflux是Spring Boot框架中的一项新功能,它是一种基于反应式编程思想的异步编程模型。它主要基于Reactor库,其核心是Flux和Mono类型,用于管理流和单个值异步处理。 相比于传统的Spring MVC框架,Webflux提供了更高的性能和更好的可伸缩性,可以有效地处理数百万请求。Webflux非常适合处理高并发、数据流处理、I/O密集型的应用,如实时通信、监控、数据处理等。 Webflux提供了许多新的特性,例如非阻塞I/O、函数式端点、响应式数据流处理、事件驱动I/O等。这些特性都极大地提高了应用程序的效率和可扩展性,同时也使代码更加简单和易于维护。 Webflux还提供了一些常见的数据存储支持,如MongoDB、Redis等。它支持Spring Boot自动配置和依赖性注入模式,可以帮助快速构建和部署反应式应用程序。 总之,Spring Boot Webflux是一个很好的选择,特别适合处理大量并发请求、I/O密集型的应用程序,能够极大地提高应用程序的效率和性能,同时也提高了可维护性和扩展性,具有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值