返回顶部
首页 > 资讯 > 后端开发 > Python >springbootwebflux过滤器(使用RouterFunction实现)
  • 535
分享到

springbootwebflux过滤器(使用RouterFunction实现)

2024-04-02 19:04:59 535人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录WEBflux过滤器(RouterFunction实现)相关类与接口示例使用测试RouterFunction的webflux代码接下来看看routerFunction下的参数校验

webflux过滤器(RouterFunction实现)

相关类与接口

HandlerFiterFunction

@FunctionalInterface
public interface HandlerFilterFunction<T extends ServerResponse, R extends ServerResponse> {
    Mono<R> filter(ServerRequest var1, HandlerFunction<T> var2);
 
    default HandlerFilterFunction<T, R> andThen(HandlerFilterFunction<T, T> after) {
        Assert.notNull(after, "HandlerFilterFunction must not be null");
        return (request, next) -> {
            HandlerFunction<T> nextHandler = (handlerRequest) -> {
                return after.filter(handlerRequest, next);
            };
            return this.filter(request, nextHandler);
        };
    }
 
    default HandlerFunction<R> apply(HandlerFunction<T> handler) {
        Assert.notNull(handler, "HandlerFunction must not be null");
        return (request) -> {
            return this.filter(request, handler);
        };
    }
 
    static HandlerFilterFunction<?, ?> ofRequestProcessor(Function<ServerRequest, Mono<ServerRequest>> requestProcessor) {
        Assert.notNull(requestProcessor, "Function must not be null");
        return (request, next) -> {
            Mono var10000 = (Mono)requestProcessor.apply(request);
            next.getClass();
            return var10000.flatMap(next::handle);
        };
    }
 
    static <T extends ServerResponse, R extends ServerResponse> HandlerFilterFunction<T, R> ofResponseProcessor(Function<T, Mono<R>> responseProcessor) {
        Assert.notNull(responseProcessor, "Function must not be null");
        return (request, next) -> {
            return next.handle(request).flatMap(responseProcessor);
        };
    }
}

HandlerFunction

@FunctionalInterface
public interface HandlerFunction<T extends ServerResponse> {
    Mono<T> handle(ServerRequest var1);
}

示例

config 层

CustomRouterConfig

@Configuration
public class CustomRouterConfig {
 
    @Bean
    public RouterFunction<ServerResponse> initRouterFunction(){
        return RouterFunctions.route()
                .GET("/test/**",serverRequest -> {
                    System.out.println("path:"+serverRequest.exchange().getRequest().getPath().pathWithinApplication().value());
 
                    return ServerResponse.ok().bodyValue("hello world");
                })
                .filter((serverRequest, handlerFunction) -> {
                    System.out.println("custom filter");
 
                    return handlerFunction.handle(serverRequest);
                })
                .build();
    }
}

使用测试

localhost:8080/test/text,控制台输出:

2020-06-21 15:18:08.005  INFO 16336 --- [           main] o.s.b.web.embedded.Netty.nettyWebServer  : Netty started on port(s): 8080
2020-06-21 15:18:08.018  INFO 16336 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 1.807 seconds (JVM running for 2.641)
custom filter
path:/test/text

RouterFunction的webflux

RouterFunction可以运行在servlet或netty上,所以我们需要将两个容器间的不同点抽象出来。

整个开发过程有几步:

1.HandleFunction,实现输入ServerRequest,输出ServerResponse

2.RouterFunction,把请求url和HandlerFunction对应起来

3.把RouterFunction包装成HttpHandler,交给容器Server处理。

代码

实体类和仓库不变

handler:

@Component
public class UserHandler {
    private final UserRepository repository;
 
    public UserHandler(UserRepository repository) {
        this.repository = repository;
    }
 
    public Mono<ServerResponse> getAllUser(ServerRequest request){
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
                .body(repository.findAll() , User.class);
    }
    public Mono<ServerResponse> createUser(ServerRequest request){
        Mono<User> userMono = request.bodyToMono(User.class);
        return ServerResponse.ok().contentType(MediaType.APPLICATION_jsON)
                .body(repository.saveAll(userMono) , User.class);
    }
    public Mono<ServerResponse> deleteUserById(ServerRequest request){
        String id = request.pathVariable("id");
        return this.repository.findById(id)
                .flatMap(user -> this.repository.delete(user)
                        .then(ServerResponse.ok().build()))
                .switchIfEmpty(ServerResponse.notFound().build());
    }
}

router:

@Configuration
public class AllRouters {
    @Bean
    RouterFunction<ServerResponse> userRouter(UserHandler handler){
        return RouterFunctions.nest(
                //相当于requestMapping
                RequestPredicates.path("/user") ,
                RouterFunctions.route(RequestPredicates.GET("/") , handler::getAllUser)
                    .andRoute(RequestPredicates.POST("/").and(RequestPredicates.accept(MediaType.APPLICATION_JSON)) , handler::createUser)
                    .andRoute(RequestPredicates.DELETE("/{id}") , handler::deleteUserById));
 
    }
}

接下来看看routerFunction下的参数校验

改造下代码(这里只写一个做例子)

public Mono<ServerResponse> createUser(ServerRequest request){
        Mono<User> userMono = request.bodyToMono(User.class);
        return userMono.flatMap(user -> {
            //在这里做校验
            //xxx
            return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
                    .body(repository.saveAll(userMono) , User.class);
        });
    }

异常捕获,用aop的方式:

@Component
@Order(-99)
public class ExceptionHandler implements WebExceptionHandler {
    @Override
    public Mono<Void> handle(ServerWebExchange serverWebExchange, Throwable throwable) {
        ServerHttpResponse response = serverWebExchange.getResponse();
        response.setStatusCode(httpstatus.BAD_REQUEST);
        response.getHeaders().setContentType(MediaType.TEXT_PLAIN);
        String errORMsg = toStr(throwable);
        DataBuffer db = response.bufferFactory().wrap(errorMsg.getBytes());
        return response.writeWith(Mono.just(db));
    }
 
    private String toStr(Throwable throwable) {
        //已知异常,自定义异常,这里懒得写了,就随便找一个代替
        if (throwable instanceof NumberFormatException){
            NumberFormatException e = (NumberFormatException) throwable;
            return e.getMessage();
        }
        //未知异常
        else {
            throwable.printStackTrace();
            return throwable.toString();
        }
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: springbootwebflux过滤器(使用RouterFunction实现)

本文链接: https://lsjlt.com/news/141897.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • springbootwebflux过滤器(使用RouterFunction实现)
    目录webflux过滤器(RouterFunction实现)相关类与接口示例使用测试RouterFunction的webflux代码接下来看看routerFunction下的参数校验...
    99+
    2024-04-02
  • springboot使用过滤器
    一:过滤器 1.过滤器介绍 过滤器是处于客户端与服务器资源文件之间的一道过滤网,帮助我们过滤一些不符合要求的请求。通常用作 Session校验,判断用户权限。 2.过滤器生命周期 使用过滤器很简单,只需要实现Filter类,然后重写它的3个...
    99+
    2023-09-03
    servlet java 开发语言 spring boot
  • Vue监听使用方法和过滤器实现
    目录前言过滤器局部过滤器代码全局过滤器watch监听简单监听复杂监听前言 今天是自学VUE整理知识点的第四天呢,今天整理一下过滤器,watch监听的知识点 过滤器 过滤器的作用:为页...
    99+
    2024-04-02
  • 使用logback实现日志打印过滤
    logback日志打印过滤 1.只打印sql语句以及参数 <?xml version="1.0" encoding="UTF-8" ?> <co...
    99+
    2024-04-02
  • SpringBoot使用SensitiveWord实现敏感词过滤
    目录导入依赖方法默认示例自定义替换策略示例自定义自定义SensitiveWordBs自定义敏感词白名单自定义敏感词黑名单示例重置词库总结包含默认敏感词过滤和自定义敏感词过滤。 导入依...
    99+
    2023-01-14
    SpringBoot SensitiveWord敏感词过滤 SpringBoot 敏感词过滤 SpringBoot SensitiveWord
  • jQuery如何使用过滤器过滤多属性
    这篇文章给大家分享的是有关jQuery如何使用过滤器过滤多属性的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用过滤器过滤多属性//This precision-based approache...
    99+
    2023-06-27
  • java 使用过滤器实现登录拦截处理
    目录滤器实现登录拦截处理一、什么是过滤器二、工作原理及生命周期三、过滤器使用filter简易实现登录功能拦截LoginFlitercontroller结果图滤器实现登录拦截处理 一、...
    99+
    2024-04-02
  • Vue过滤器怎么实现
    这篇文章主要介绍“Vue过滤器怎么实现”,在日常操作中,相信很多人在Vue过滤器怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue过滤器怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!&l...
    99+
    2023-06-25
  • Python实现布隆过滤器
    转载自:http://blog.csdn.net/demon24/article/details/8537665 http://blog.csdn.net/u013402746/article/details/28414901      ...
    99+
    2023-01-31
    过滤器 Python
  • JavaSpringBoot使用guava过滤器
    目录介绍特点数据结构新增数据查询数据删除数据作用业务使用快速开始介绍 布隆过滤器(BloomFilter)是一种数据结构,特点是高效地插入和查询,可以用来告诉你某个key一定不存在或...
    99+
    2024-04-02
  • SpringBoot过滤器的使用
    目录一、什么是过滤器二、过滤器的使用三、测试结果一、什么是过滤器 过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆...
    99+
    2024-04-02
  • SpringBoot过滤器实现项目内接口过滤详解
    目录业务需要处理的问题公众号用户信息与业务系统做绑定将路由中心的接口与业务系统的接口判断处理步骤全部代码代理转发实现业务 由于业务需求,存在两套项目,一套是路由中心,一套是业务系统....
    99+
    2023-05-16
    SpringBoot实现项目接口过滤 SpringBoot项目接口过滤 SpringBoot过滤器
  • 怎么在java中使用Filter实现过滤
    今天就跟大家聊聊有关怎么在java中使用Filter实现过滤,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应...
    99+
    2023-06-14
  • SpringBoot过滤器Filter使用实例详解
    目录简介用法功能实现简介 过滤器是AOP(面向切面编程)思想的具体实现。可以过滤浏览器发出的请求,并且决定放行请求还是中断请求。 在浏览器对服务器发起请求或者服务器对浏览器响应,都会...
    99+
    2024-04-02
  • 使用golang怎么实现一个布谷鸟过滤器
    本文章向大家介绍使用golang怎么实现一个布谷鸟过滤器的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。golang适合做什么golang可以做服务器端开发,但golang很适合做日志处理、数据打包、虚拟机处理、...
    99+
    2023-06-06
  • springboot中使用过滤器,jsoup过滤XSS脚本详解
    目录springboot使用过滤器,jsoup过滤XSS脚本1.把可能包含脚本的参数位置分析一下2.分析实现过程3.代码实现过程使用jsoup防止XSS攻击springboot使用过...
    99+
    2024-04-02
  • AngularJS怎么使用过滤器
    这篇文章给大家分享的是有关AngularJS怎么使用过滤器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、为什么使用过滤器? 在实际操作中,我们需要对统一数据源进行多次转换,比...
    99+
    2024-04-02
  • vue如何使用过滤器
    在vue中使用过滤器的方法:1.新建vue.js项目;2.使用import方法引入filter过滤器;3.全局注册过滤器;4.执行命令直接引用;具体步骤如下:首先,在vue-cli中创建一个vue.js项目;vue create proje...
    99+
    2024-04-02
  • Shell过滤器怎么使用
    这篇文章主要介绍“Shell过滤器怎么使用”,在日常操作中,相信很多人在Shell过滤器怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Shell过滤器怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-09
  • Django实现drf搜索过滤和排序过滤
    前言 当我们需要对后台的数据进行过滤的时候,drf有两种,搜索过滤和排序过滤。 搜索过滤:比如我们想返回sex=1的,那么我们就可以从所有数据中进行筛选 排序过滤:比如我们想对价格进...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作