`
顽石
  • 浏览: 166814 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring webflux过滤器

 
阅读更多

    spring5 webflux模块中的webfilter模型与其他过滤器或拦截器是类似的,众多filter可以组成过滤链,过滤器链的图示就不画了。

    webflux filter目前没有servlet filter中的url pattern功能,它对所有请求进行过滤,如果要实现url pattern可以自己在过滤器中匹配url。

 

过滤器的调用顺序

    如果有多个webflux webfliter,那其调用的先后顺序如何确定?在过滤链中的调用顺序遵循如下规则:

     1.webfilter实现类上有@Order注解的排在没有该注解的前面.

     2. 对有@Order注解的webfliter,order值(为有符号的int)小的排在前面。

     3. 对没有@Order注解的,按实现类的全限定类名(含有包名)的字典序升序排列。

     4. 过滤器也是spring bean,绝大多数情况下是单例,如果不是单例,这些实例之间

     调用顺序估计按照实例化的时间先后排列。

   

 

  webfliter实现

  webflux中的filter要实现org.springframework.web.server.WebFilter接口,该接口只有一个方法filter。

 

  两个过滤器实现:RequestFilter1和RequestFilter2.

 

  @Component

  @Order(-5)

  public  class RequestFilter1 implements WebFilter {

          @Override

          //返回Mono<Void> 表示该过滤器的处理已经结束。

         public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain)           {

             /*ServerWebExchange寓意交换/兑换(exchange):用请求换回响应. 所以ServerWebExchange包含有成对的http请求对象ServerHttpRequest和http响应对象ServerHttpResponse.

            ServerHttpRequest是webflux controller中的http请求对象,类似webmvc中的HttpServletRequest

           */

            ServerHttpRequest request =  exchange.getRequest();

            ServerHttpResponse response =  exchange.getResponse(); 

 

           //获取请求http头appKey值

           String appKey = request.getHeaders().getFirst("appKey");

           System.out.println("appKey="+appKey);

 

           //添加请求属性key和value

          exchange.getAttributes().put("k1", "v1");

           

           /*过滤器链的概念都是类似的,调用过滤器链的filter方法将请求转到下一个filter,如果该filter是最后一  个filter,那就转到

           该请求对应的handler,也就是controller方法或函数式endpoint */

           return chain.filter(exchange);

        }

    }

}

 

 @Component

 //@Order(1)

 public  class RequestFilter2 implements WebFilter {

    

    @Override

    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {

           ServerHttpRequest request =  exchange.getRequest();

           // 获取上个filter设置的属性k1

           String value = (String)exchange.getAttributes().get("k1");

           System.out.println("value="+value);

           return chain.filter(exchange);

        }

    }

}

 

过滤器的通常用法  

 过滤器通常用来实现一些横切的逻辑,例如认证授权、日志记录。

下面的过滤器检查http请求头中是否有token头,如果没有则将请求forward转到/auth/error,由对应的controller进行处理。这个也演示了如何用WebFilter来forward请求。

@Component

public  class AuthFilter implements WebFilter {

   

    @Override

    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {

           ServerHttpRequest request =  exchange.getRequest();

           //ServerHttpResponse response =  exchange.getResponse(); 

 

           String tokenValue = request.getHeaders().getFirst("token");

           if(null == token){

                /*http头中没有appKey,修改请求的目标url为/auth/error

                  request.mutate返回一个请求构建器(builder design pattern),path方法修改请求的url,build方法返回新的request 

                  最后调用chain.filter将请求forward到修改后的url:/auth/error

               */ 

               ServerHttpRequest authErrorReq = request.mutate().path("/auth/error").build();

               //erverWebExchange.mutate类似,构建一个新的ServerWebExchange

               ServerWebExchange authErrorExchange =                 exchange.mutate().request(authErrorReq).build();

               return chain.filter(autherrorExchange);

           }

           else{

               return chain.filter(exchange);

           }

        }

    }

 

}

 

 

 

也可在过滤器中直接处理请求,跳过后面的filter和controller

@Component

public  class AuthFilter implements WebFilter {

    @Override

    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {

           ServerHttpRequest request =  serverWebExchange.getRequest();

           ServerHttpResponse response =  serverWebExchange.getResponse(); 

 

           String tokenValue = request.getHeaders().getFirst("token");

           if(null == token){

                   // 直接返回响应结果,跳过后面的filter和controller

                   response.setStatusCode(HttpStatus.OK);

                   response.getHeaders().setContentType(MediaType.APPLICATION_JSON);

                   return response.writeWith(Mono.just(response.bufferFactory().wrap("{\"msg\":\"no token\"}".getBytes())));

            }

            else {

                return webFilterChain.filter(serverWebExchange);

            }

        }

    }

 

}

 

 

过滤器后处理

前面的演示都还是前处理,在后面的filter完成之后,控制流回到本filter。

可以在WebFilterChain的filter方法后面加入后处理逻辑,这个要熟悉spring reactor3的运算符/算子(operator), 例如doFinally、then、thenEmpty、thenMany、map、flatMap等,后处理逻辑分布在这些运算符中,只要最终返回Mono<Void>即可。

 

@Component

public  class PostProcessingFilter implements WebFilter {

    @Override

    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {

        //后处理,打印完成信号的值

        return chain.filter(exchange).doFinally(s ->  System.out.println("signal="+s.toString()));

        

        /* 其他几种

        * or 1: 建议尽量采用链式的fluent连贯写法

        *   Mono<Void>  completeMono = chain.filter(exchange);

        *   return completeMono.doFinally(s -> System.out.println("signal="+s.toString()));

        */

        //or 2: return chain.filter(exchange).thenEmpty(other);

        //or 3: return chain.filter(exchange).thenMany(other).map(..)....then();   

    }

 

}  

分享到:
评论

相关推荐

    spring webflux使用的详细代码

    以上就是Spring WebFlux的基本使用和关键概念,结合提供的"boot-webflux"项目,你可以进一步探索更多细节,包括路由定义、过滤器、中间件、自定义异常处理、反应式数据访问等功能,从而全面掌握Spring WebFlux在实际...

    spring webflux demo

    **Spring WebFlux 演示项目** Spring WebFlux 是 Spring Framework 的一个模块,它引入了一种响应式编程模型,用于构建非阻塞式的Web应用程序。与传统的基于Servlet的Spring MVC不同,WebFlux旨在优化性能,提高...

    Java_Spring Webflux课程代码.zip

    此外,WebFilter接口用于实现过滤器功能,可以进行请求预处理和响应后处理。 3. **RouterFunction与Controller** 在Spring WebFlux中,你可以使用传统的注解式Controller或者函数式编程的RouterFunction来定义路由...

    使用SpringCloud和Spring WebFlux开发的学生作业管理系统服务端,前后端分离项目

    首先,SpringCloud是基于Spring Boot的微服务治理框架,它提供了包括服务注册与发现、负载均衡、熔断器、配置中心、API Gateway等一系列功能,使得构建分布式系统变得更加简单。在本项目中,我们将利用Eureka进行...

    webFlux:SpringwebFlux

    - `WebFilter`:过滤器接口,允许在请求和响应处理链中插入自定义逻辑。 - `WebSession`:提供了会话管理功能,与传统Web应用中的session类似,但设计上更适合非阻塞环境。 4. **非阻塞I/O与反应式堆栈** Spring...

    spring-webflux-security-jwt:使用Spring Reactive Webflux,Spring Boot 2和Spring Security 5的JWT授权和认证实现

    使用JWT与Spring WebFlux和Spring Security Reactive进行身份验证和授权首先阅读的好文档在开始之前,我建议您先阅读下一份参考启用S​​pring WebFlux安全性在你的应用程序首先使Webflux安全@EnableWebFluxSecurity...

    sample-spring-cloud-webflux:示例微服务,演示了如何通过spring webflux和集成spring spring,eureka,ribbon,spring cloud gateway,spring data jpa和mongodb使用springReact支持

    而Spring Cloud Gateway作为一个API网关,集成了路由、过滤器等功能,可以统一处理跨服务的请求和响应,简化了微服务间的通信。 在数据访问层面,Spring Data JPA为开发者提供了便捷的方式来操作关系型数据库,如...

    springcloud getaway 全局过滤器.doc

    本文将深入探讨如何在Spring Cloud Gateway中自定义全局过滤器。 首先,我们需要了解Spring Cloud Gateway的基本架构。Gateway基于Spring Framework 5、Project Reactor和Spring WebFlux构建,它提供了一种高效且...

    spring-webflux-demo:一个简单的spring webflux演示,用于学习

    - 类似于Spring MVC的拦截器,WebFlux提供了过滤器机制,可以在请求处理前后进行拦截,如日志记录、安全检查等。 4. **WebFlux配置**: - 可以通过`WebFluxConfigurer`接口自定义配置,如设置编码解码器、路由...

    spring-webflux-restful-service

    在处理HTTP请求时,Spring WebFlux提供了过滤器(Filter)和拦截器(Interceptor)机制,以实现统一的请求预处理和后处理。`WebFilter`和`WebHandler`接口分别对应于Spring MVC的Filter和Handler。 此外,错误处理...

    解决spring-boot2.0.6中webflux无法获得请求IP的问题

    `WebFilter`是WebFlux中的过滤器概念,类似于Servlet API中的`Filter`,它允许你在处理链中对请求和响应进行拦截。 以下是一个示例`WebFilter`实现,用来获取客户端IP: ```java @Component public class ...

    spring-web-flux-demo:此存储库包含有关Spring WebFlux REST API的一些演示

    Spring WebFlux是Spring框架的一个重要模块,专为构建反应式Web应用程序而设计。它引入了一种非阻塞、事件驱动的编程模型,用于处理高并发场景,优化服务器资源利用率。在本文中,我们将深入探讨Spring WebFlux REST...

    spring_webflux_techs:带有MongoDB的Spring Webflux Rest API

    在Spring WebFlux中,路由和过滤器是通过`RouterFunction`和`FilterFunction`来定义的。例如,我们可以创建一个路由函数来处理用户相关的请求: ```java @Bean public RouterFunction&lt;ServerResponse&gt; route...

    springwebflux-ask:范例代码

    2. `WebFluxConfigurer`:这是用来配置WebFlux的接口,可以设置路由、过滤器等。 3. `Mono` 和 `Flux`:Reactor中的核心类型,它们代表了可能的单个值或多个值的异步序列。 4. `ControllerAdvice`:类似于Spring MVC...

    spring_gateway_security_webflux.rar

    1.本项目为SpringCloud ...2.由于Gateway采用的是纯Webflux方式,所以原有的Spring基于传统拦截器、过滤器的方式无法正常使用SpringSecurity。 3.因此,本项目根据WebFlux的方式,进行了整合,实现了登录和权限验证。

    spring-webflux-essentials

    3. **路由和过滤器**:Spring WebFlux使用`RouterFunction`来定义路由规则,它可以匹配HTTP请求并将其转发给适当的处理函数。同时,`FilterFunction`可以用来对请求和响应进行拦截和修改,实现类似于Spring MVC的...

    heroes-api:API super gerenciamento de superheróisutilizando spring webflux(estudo de monoflux反​​应性物流)

    6. **路由和过滤器**: 在Spring WebFlux中,我们可以定义路由函数来映射HTTP请求到处理函数。同时,过滤器用于在请求处理链中执行预处理和后处理任务,如身份验证、日志记录等。 7. **数据库集成**: 虽然描述中未...

    深入剖析Spring Web源码 pdf高清版(第二版)

    - WebFilter和WebExceptionHandler:处理过滤器和异常处理,与Spring MVC中的拦截器和异常处理器类似。 3. 执行流程: - 客户端发起请求,到达Reactor Netty或Undertow等服务器。 - WebFlux的ServerWebExchange...

    spring-webflux-introduction:出于演示目的

    它们是反应式版本的 Spring MVC 过滤器和异常处理器。 4. **Reactive Data Access**: Spring Data 的反应式模块(如 Spring Data R2DBC)可以与 WebFlux 结合使用,提供非阻塞的数据访问,如数据库操作。这有助于...

    最新Spring Cloud Gateway 官方参考指南-中文版-3.x

    过滤器链分为"pre"和"post"两部分,先执行所有"pre"过滤器,然后执行"post"过滤器。 配置路由、谓词和过滤器可以通过YAML或properties文件进行,有两种方式:简写和完全展开。简写方式直接使用过滤器名称和参数值,...

Global site tag (gtag.js) - Google Analytics