自定义局部过滤器

需求:在application.yml中对某个路由配置过滤器,该过滤器可以在控制台输出配置文件中指定名称的请求参数的值。

在gateway-server模块中编写过滤器工厂类MyParamGatewayFilterFactory

package com.icoding.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.stereotype.Component;

import java.util.Arrays;import java.util.List;

/** 自定义局部过滤器 */@Componentpublic class MyParamGatewayFilterFactory extends        AbstractGatewayFilterFactory {    private static final String PARAM_KEY = "param";    /** 定义构造器(必须) */    public MyParamGatewayFilterFactory(){        super(Config.class);    }    /** 接收过滤器传进来的字段集合(可选) */    @Override    public List shortcutFieldOrder() {return Arrays.asList(PARAM_KEY);    }    /** 重写拦截方法(必须) */    @Override    public GatewayFilter apply(Config config) {return (exchange, chain) -> {            // 获取请求对象            ServerHttpRequest request = exchange.getRequest();            // 获取请求参数 http://localhost:10010/api/user/get/2?name=zhangsan&age=30if (request.getQueryParams().containsKey(config.param)){                request.getQueryParams().get(config.param).forEach(value -> {                    System.out.println(config.param + " = " + value);                });            }            // 放行return chain.filter(exchange);        };    }    /** 定义配置类,接收配置文件中的属性(必须) */    public static class Config {        private String param;        public String getParam() {return param;        }        public void setParam(String param) {            this.param = param;        }    }}

在gateway-server模块中修改application.yml配置文件

package com.icoding.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.stereotype.Component;

import java.util.Arrays;import java.util.List;

/** 自定义局部过滤器 */@Componentpublic class MyParamGatewayFilterFactory extends        AbstractGatewayFilterFactory {    private static final String PARAM_KEY = "param";    /** 定义构造器(必须) */    public MyParamGatewayFilterFactory(){        super(Config.class);    }    /** 接收过滤器传进来的字段集合(可选) */    @Override    public List shortcutFieldOrder() {return Arrays.asList(PARAM_KEY);    }    /** 重写拦截方法(必须) */    @Override    public GatewayFilter apply(Config config) {return (exchange, chain) -> {            // 获取请求对象            ServerHttpRequest request = exchange.getRequest();            // 获取请求参数 http://localhost:10010/api/user/get/2?name=zhangsan&age=30if (request.getQueryParams().containsKey(config.param)){                request.getQueryParams().get(config.param).forEach(value -> {                    System.out.println(config.param + " = " + value);                });            }            // 放行return chain.filter(exchange);        };    }    /** 定义配置类,接收配置文件中的属性(必须) */    public static class Config {        private String param;        public String getParam() {return param;        }        public void setParam(String param) {            this.param = param;        }    }}server:  port: 10010spring:  application:    name: api-gateway  cloud:    gateway:# 默认过滤器,对所有路由生效      default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin        - AddResponseHeader=name,admin      routes:# 路由id,可以随意写        - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务)          uri: lb://user-service# 路由断言,可以配置映射路径          predicates:            - Path=/api/user/**          filters:# 表示过滤1个路径,2表示两个路径,以此类推            - StripPrefix=1# 自定义过滤器            - MyParam=nameeureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekaserver:  port: 10010spring:  application:    name: api-gateway  cloud:    gateway:# 默认过滤器,对所有路由生效      default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin        - AddResponseHeader=name,admin      routes:# 路由id,可以随意写        - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务)          uri: lb://user-service# 路由断言,可以配置映射路径          predicates:            - Path=/api/user/**          filters:# 表示过滤1个路径,2表示两个路径,以此类推            - StripPrefix=1# 自定义过滤器            - MyParam=nameeureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

测试访问

http://localhost:10010/api/user/1?name=admin 检查后台是否输出name和admin

http://localhost:10010/api/user/1?name2=admin 则是不会输出的。

自定义全局过滤器

需求:模拟一个登录的校验。基本逻辑:如果请求中有token参数,则认为请求有效,放行。

在gateway-server模块中编写全局过滤器类MyGlobalFilter

课堂代码:

package com.icoding.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.stereotype.Component;

import java.util.Arrays;import java.util.List;

/** 自定义局部过滤器 */@Componentpublic class MyParamGatewayFilterFactory extends        AbstractGatewayFilterFactory {    private static final String PARAM_KEY = "param";    /** 定义构造器(必须) */    public MyParamGatewayFilterFactory(){        super(Config.class);    }    /** 接收过滤器传进来的字段集合(可选) */    @Override    public List shortcutFieldOrder() {return Arrays.asList(PARAM_KEY);    }    /** 重写拦截方法(必须) */    @Override    public GatewayFilter apply(Config config) {return (exchange, chain) -> {            // 获取请求对象            ServerHttpRequest request = exchange.getRequest();            // 获取请求参数 http://localhost:10010/api/user/get/2?name=zhangsan&age=30if (request.getQueryParams().containsKey(config.param)){                request.getQueryParams().get(config.param).forEach(value -> {                    System.out.println(config.param + " = " + value);                });            }            // 放行return chain.filter(exchange);        };    }    /** 定义配置类,接收配置文件中的属性(必须) */    public static class Config {        private String param;        public String getParam() {return param;        }        public void setParam(String param) {            this.param = param;        }    }}server:  port: 10010spring:  application:    name: api-gateway  cloud:    gateway:# 默认过滤器,对所有路由生效      default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin        - AddResponseHeader=name,admin      routes:# 路由id,可以随意写        - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务)          uri: lb://user-service# 路由断言,可以配置映射路径          predicates:            - Path=/api/user/**          filters:# 表示过滤1个路径,2表示两个路径,以此类推            - StripPrefix=1# 自定义过滤器            - MyParam=nameeureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekaserver:  port: 10010spring:  application:    name: api-gateway  cloud:    gateway:# 默认过滤器,对所有路由生效      default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin        - AddResponseHeader=name,admin      routes:# 路由id,可以随意写        - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务)          uri: lb://user-service# 路由断言,可以配置映射路径          predicates:            - Path=/api/user/**          filters:# 表示过滤1个路径,2表示两个路径,以此类推            - StripPrefix=1# 自定义过滤器            - MyParam=nameeureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekapackage com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/** * 全局过滤器 */    @Component// @Order(1)    :  Ordered这个接口也可以使用注解来排序public class MyGlobalFilter implements GlobalFilter, Ordered {    /*如果你有token就让他们访问,如果没有token,不让访问*/    @Override    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {        System.out.println("全局过滤器执行了。。。。。。。");        //获取参数        String token = exchange.getRequest().getQueryParams().getFirst("token");        /*        *  String aa = "";        *  String bb = "          ";        *  String cc = null;        *        *   如果是isBlank 都是返回true        *        * */        if(StringUtils.isBlank(token)){            //为空,token没有值,阻止往下执行            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置返回的状态码            //不会继续往下执行了!            return exchange.getResponse().setComplete();        }        //放行        return chain.filter(exchange);    }    /*数值越小越先执行*/    @Override    public int getOrder() {        return 5;    }}package com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/** * 全局过滤器 */    @Component// @Order(1)    :  Ordered这个接口也可以使用注解来排序public class MyGlobalFilter implements GlobalFilter, Ordered {    /*如果你有token就让他们访问,如果没有token,不让访问*/    @Override    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {        System.out.println("全局过滤器执行了。。。。。。。");        //获取参数        String token = exchange.getRequest().getQueryParams().getFirst("token");        /*        *  String aa = "";        *  String bb = "          ";        *  String cc = null;        *        *   如果是isBlank 都是返回true        *        * */        if(StringUtils.isBlank(token)){            //为空,token没有值,阻止往下执行            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置返回的状态码            //不会继续往下执行了!            return exchange.getResponse().setComplete();        }        //放行        return chain.filter(exchange);    }    /*数值越小越先执行*/    @Override    public int getOrder() {        return 5;    }}
package com.icoding.filter;

import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.stereotype.Component;

import java.util.Arrays;import java.util.List;

/** 自定义局部过滤器 */@Componentpublic class MyParamGatewayFilterFactory extends        AbstractGatewayFilterFactory {    private static final String PARAM_KEY = "param";    /** 定义构造器(必须) */    public MyParamGatewayFilterFactory(){        super(Config.class);    }    /** 接收过滤器传进来的字段集合(可选) */    @Override    public List shortcutFieldOrder() {return Arrays.asList(PARAM_KEY);    }    /** 重写拦截方法(必须) */    @Override    public GatewayFilter apply(Config config) {return (exchange, chain) -> {            // 获取请求对象            ServerHttpRequest request = exchange.getRequest();            // 获取请求参数 http://localhost:10010/api/user/get/2?name=zhangsan&age=30if (request.getQueryParams().containsKey(config.param)){                request.getQueryParams().get(config.param).forEach(value -> {                    System.out.println(config.param + " = " + value);                });            }            // 放行return chain.filter(exchange);        };    }    /** 定义配置类,接收配置文件中的属性(必须) */    public static class Config {        private String param;        public String getParam() {return param;        }        public void setParam(String param) {            this.param = param;        }    }}server:  port: 10010spring:  application:    name: api-gateway  cloud:    gateway:# 默认过滤器,对所有路由生效      default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin        - AddResponseHeader=name,admin      routes:# 路由id,可以随意写        - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务)          uri: lb://user-service# 路由断言,可以配置映射路径          predicates:            - Path=/api/user/**          filters:# 表示过滤1个路径,2表示两个路径,以此类推            - StripPrefix=1# 自定义过滤器            - MyParam=nameeureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekaserver:  port: 10010spring:  application:    name: api-gateway  cloud:    gateway:# 默认过滤器,对所有路由生效      default-filters:# 添加响应头过滤器,添加一个响应头为name,值为admin        - AddResponseHeader=name,admin      routes:# 路由id,可以随意写        - id: user-service-route# 代理的服务地址;lb表示负载均衡(从eureka中获取具体服务)          uri: lb://user-service# 路由断言,可以配置映射路径          predicates:            - Path=/api/user/**          filters:# 表示过滤1个路径,2表示两个路径,以此类推            - StripPrefix=1# 自定义过滤器            - MyParam=nameeureka:  client:    service-url:      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eurekapackage com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/** * 全局过滤器 */    @Component// @Order(1)    :  Ordered这个接口也可以使用注解来排序public class MyGlobalFilter implements GlobalFilter, Ordered {    /*如果你有token就让他们访问,如果没有token,不让访问*/    @Override    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {        System.out.println("全局过滤器执行了。。。。。。。");        //获取参数        String token = exchange.getRequest().getQueryParams().getFirst("token");        /*        *  String aa = "";        *  String bb = "          ";        *  String cc = null;        *        *   如果是isBlank 都是返回true        *        * */        if(StringUtils.isBlank(token)){            //为空,token没有值,阻止往下执行            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置返回的状态码            //不会继续往下执行了!            return exchange.getResponse().setComplete();        }        //放行        return chain.filter(exchange);    }    /*数值越小越先执行*/    @Override    public int getOrder() {        return 5;    }}package com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.core.annotation.Order;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/** * 全局过滤器 */    @Component// @Order(1)    :  Ordered这个接口也可以使用注解来排序public class MyGlobalFilter implements GlobalFilter, Ordered {    /*如果你有token就让他们访问,如果没有token,不让访问*/    @Override    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {        System.out.println("全局过滤器执行了。。。。。。。");        //获取参数        String token = exchange.getRequest().getQueryParams().getFirst("token");        /*        *  String aa = "";        *  String bb = "          ";        *  String cc = null;        *        *   如果是isBlank 都是返回true        *        * */        if(StringUtils.isBlank(token)){            //为空,token没有值,阻止往下执行            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //设置返回的状态码            //不会继续往下执行了!            return exchange.getResponse().setComplete();        }        //放行        return chain.filter(exchange);    }    /*数值越小越先执行*/    @Override    public int getOrder() {        return 5;    }}package com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/** 自定义全局过滤器 */@Componentpublic class MyGlobalFilter implements GlobalFilter, Ordered {    @Override    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {        System.out.println("==全局过滤器MyGlobalFilter==");        String token = exchange.getRequest().getQueryParams().getFirst("token");if (StringUtils.isBlank(token)){            // 设置响应状态码: 401 未授权            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);            // 返回响应完成return exchange.getResponse().setComplete();        }        // 放行return chain.filter(exchange);    }    @Override    public int getOrder() {        // 值越小越先执行return 1;    }package com.icoding.filter;import org.apache.commons.lang.StringUtils;import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;/** 自定义全局过滤器 */@Componentpublic class MyGlobalFilter implements GlobalFilter, Ordered {    @Override    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {        System.out.println("==全局过滤器MyGlobalFilter==");        String token = exchange.getRequest().getQueryParams().getFirst("token");if (StringUtils.isBlank(token)){            // 设置响应状态码: 401 未授权            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);            // 返回响应完成return exchange.getResponse().setComplete();        }        // 放行return chain.filter(exchange);    }    @Override    public int getOrder() {        // 值越小越先执行return 1;    }

测试访问

访问 http://localhost:10010/api/user/1

访问 http://localhost:10010/api/user/1?token=admin

回复关键词

JUC    分布式限流   消息队列   alibaba    JVM性能调优

看更多精彩教程

别忘了点个在看哦!转发那就太好了!

过滤器获取service方法返回慢_Gateway:自定义过滤器相关推荐

  1. 过滤器获取service方法返回慢_Spring Cloud Gateway-全局过滤器(Global Filters)

    TIPS本文基于Spring Cloud Gateway SR2,理论适配Spring Cloud Gateway SR1以及更高版本. 本文详细探讨Spring Cloud Gateway内置的全局 ...

  2. asp.net MVC之 自定义过滤器(Filter)

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  3. MVC之 自定义过滤器(ActionFilterAttribute)

    一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名. //表示所有操作 ...

  4. 使用adblock的高级自定义过滤器, 来过滤包含特定文字的html元素

    需求:  想用adblock 过滤一个div窗体,   该窗体的特征是其子元素包含指定的文字. 解决方法: 使用adblock的 Snippet  过滤器语法. snippet 命令 hide-if- ...

  5. ThinkPHP6.0使用twig作为模板引擎及自定义过滤器

    ThinkPHP自带的模板引擎用起来很不顺手,好在找到了一个和Jinja2很类似的一个一个模板引擎Twig,可以集成到ThinkPHP中. 文档: https://github.com/yunwuxi ...

  6. 09_Filter过滤器(访问所有资源前,首先执行自定义过滤器类的doFilter方法)_Listener监听器(监听域对象的改变)

    Filter 什么是Web过滤器? 如何使用Filter过滤器? 自定义Filter类的生命周期 过滤器可以拦截哪些资源路径? 拦截方式配置:资源被访问的方式 过滤器链的默认执行顺序是什么? 如何配置 ...

  7. 关于将struts2框架下,使自定义过滤器对部分的action(一个action或多个action)请求忽略的方法

    关于将struts2框架下,使自定义过滤器对部分的action请求忽略的方法 首先需要了解一个方法 request.getServletPath() 他将返回一个当前请求的路径的醉详细名称 例如对路径 ...

  8. 统计文件种类数+获取子shell返回值的其它方法

    前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...

  9. ajax返回值并在layui显示,layUI使用layer.open,在content打开数据表格,获取值并返回的方法...

    在layUI编写的页面中,遇到这么一种情况,从一个页面中使用layer.open打开一个新窗口,新窗口中是一个数据表格,现在需要选中数据表格中的一列并获取它的值,以便下面这个选择按钮可以使用这个值进行 ...

最新文章

  1. Mysql高级调优篇——前言简介
  2. 【树形DP】树的重心详解+多组例题详解
  3. php tp 查数据库数据一条_PHP自学(六)TP框架进行数据库查询
  4. ORACLE会话数、连接数配置
  5. 生成器模式 - 让配置代码更优雅
  6. 中南民族大学计算机类有什么具体专业,中南民族大学计算机科学学院计算机科学与技术专业简介...
  7. hdu_5761_Rower Bo(xjb猜公式)
  8. 刚装了fedora 17,装机必备,解决视频格式和中文输入法。
  9. PHP array_map()
  10. 前端进阶之防抖与节流是什么?
  11. 第一章python绝对温标身体质量指数bmi
  12. CodeForces 706A Beru-taxi
  13. 如何为新建网站选择好的域名
  14. 浏览器访问一个地址的大概操作步骤
  15. 190517每日一句
  16. 程序员技能与成长:程序员的必备工具箱(值得收藏)
  17. Google可能将退出中国市场
  18. android fsck_msdos 分析(二)
  19. survival | 生存分析(3):生存曲线(下)
  20. 机器视觉实用工具集NO.16——指定监控区域运动物体闯入检测工具

热门文章

  1. UVM基础之------uvm_port_base
  2. php的yii框架开发总结2
  3. 使用css的类名交集复合选择器
  4. Heartbeat,来点真的
  5. [导入]DotNet软件开发框架
  6. Some best freeware
  7. inet_aton和inet_network和inet_addr三者比较-《别怕Linux编程》之五
  8. dingo php,用laravel dingo/api创建简单的api
  9. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化
  10. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和static