过滤器工厂详解

news2025/1/22 12:25:46

 

 

 

内置过滤器

1 AddRequestHeader GatewayFilter Factory   添加请求头

2 AddRequestParameter GatewayFilter Factory

3 AddResponseHeader GatewayFilter Factory

4 DedupeResponseHeader GatewayFilter Factory

5 Hystrix GatewayFilter Factory

6 FallbackHeaders GatewayFilter Factory

7 PrefixPath GatewayFilter Factory

8 PreserveHostHeader GatewayFilter Factory

9 RequestRateLimiter GatewayFilter Factory

10 RedirectTo GatewayFilter Factory

11 RemoveHopByHopHeadersFilter GatewayFilter Factory

12 RemoveRequestHeader GatewayFilter Factory

13 RemoveResponseHeader GatewayFilter Factory

14 RewritePath GatewayFilter Factory

15 RewriteResponseHeader GatewayFilter Factory

16 SaveSession GatewayFilter Factory

17 SecureHeaders GatewayFilter Factory

18 SetPath GatewayFilter Factory

19 SetResponseHeader GatewayFilter Factory

20 SetStatus GatewayFilter Factory

21 StripPrefix GatewayFilter Factory

22 Retry GatewayFilter Factory

23 RequestSize GatewayFilter Factory

24 Modify Request Body GatewayFilter Factory

25 Modify Response Body GatewayFilter Factory 26 Default Filters

使用内置过滤器

下图controller会输出bar!!!

 

 

自定义过滤器

命名规范:过滤器工厂的类名必须以GatewayFilterFactory为后缀

package com.qf.predicates;

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * <p>title: com.wfx.filters</p>
 * author zhuximing
 * description:
 */
@Component
    public class CalServiceTimeGatewayFilterFactory extends AbstractGatewayFilterFactory<MyConfig> {


    public CalServiceTimeGatewayFilterFactory() {
        super(MyConfig.class);
    }

    @Override
    public GatewayFilter apply(MyConfig config) {



        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                //前处理
                long startTime = System.currentTimeMillis();

                System.out.println("name:"+config.getKey());
                System.out.println("value:"+config.getValue());


//                return chain.filter(exchange);//放行

                return  chain.filter(exchange).then(
                    //后置处理
                    Mono.fromRunnable(()->{
                        System.out.println("post come in");
                        //获取系统当前时间戳为endTime
                        long entTime = System.currentTimeMillis();
                        System.out.println("time="+(entTime-startTime));

                    }));
            }
        };
    }
//默认不用改

    @Override
    public ShortcutType shortcutType() {
        return ShortcutType.DEFAULT;
    }
}
server:
  #gateway的端口
  port: 8040

spring:
  application:
    name: cloud-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: pro #服务发布到指定的namespace,默认是public
        group: my-group #服务发布到指定的group,默认值是DEFAULT_GROUP
    gateway:
      routes:
        - id: cloud-goods
          uri: lb://cloud-goods/
          predicates:
            - Path=/goods/**
            - After=2021-08-23T15:51:15.200+08:00[Asia/Shanghai]
            - Cookie=age,18
            - MyHeader=name,jack
          filters:
            - AddRequestHeader=token,123
            - CalServiceTime=a,b
        - id: baidu
          uri: http://www.baidu.com
          predicates:
            - Path=/**  #http://localhost:8040/a=》http://www.baidu.com/a

全局过滤器

Spring Cloud Gateway内置的全局过滤器。包括:

1 Combined Global Filter and GatewayFilter Ordering

2 Forward Routing Filter

3 LoadBalancerClient Filter

4 Netty Routing Filter

5 Netty Write Response Filter

6 RouteToRequestUrl Filter

7 Websocket Routing Filter

8 Gateway Metrics Filter

9 Marking An Exchange As Routed

自定义全局过滤器  

下图可以判断是否登录

package com.qf.filters;

import cn.hutool.json.JSONUtil;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>title: com.qf.filters</p>
 * <p>Company: wendao</p>
 * author zhuximing
 * date 2021/8/23
 * description:
 */
@Component
public class AuthFilter implements GlobalFilter, Ordered {


    //针对所有的路由进行过滤
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //过滤器的前处理
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        String token = request.getHeaders().getFirst("token");
        if(StringUtils.isEmpty(token)){
            Map res = new HashMap(){{
                put("msg", "没有登录!!");
            }};
           return response(response,res);
        }else{
            if(!"123".equals(token)){
                Map res = new HashMap(){{
                    put("msg", "令牌无效!!");
                }};
                return response(response,res);
            }else{
                return  chain.filter(exchange);  //放行
            }
        }



    }

    private Mono<Void>  response(ServerHttpResponse response,Object msg){
        response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
        String resJson = JSONUtil.toJsonPrettyStr(msg);
        DataBuffer dataBuffer = response.bufferFactory().wrap(resJson.getBytes());
        return response.writeWith(Flux.just(dataBuffer));//响应json数据
    }




    //数字越小越先执行
    @Override
    public int getOrder() {
        return 0;
    }

public Mono<Void>  response(ServerHttpResponse response,Object msg){
    response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
    String resJson = JSONUtil.toJsonPrettyStr(msg);
    DataBuffer dataBuffer = response.bufferFactory().wrap(resJson.getBytes());
    return response.writeWith(Flux.just(dataBuffer));//响应json数据
}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

答对这 9 题你就超越了 83.3% 的图数据库 NebulaGraph 用户

熟悉 NebulaGraph 社区的小伙伴可能都知道一个技能认证叫做&#xff1a;NGCP&#xff0c;全称 NebulaGraph Certified Professional。用户在考试认证期间在 1 个小时内回答 100 道题目&#xff0c;并获得 60 分&#xff0c;便是 NebulaGraph 认证过的 NGCP 用户。NGCP 用户除了…

二、Node.js 模块基础 1.0

模块、模块化 在讲Node.js当中的模块之前先来简单了解什么是模块、模块化、以及模块化编程的演变过程&#xff1b;模块通常指的是编程语言提供的代码组织机制&#xff0c;利用此机制可将程序拆解位独立且通用的代码单元&#xff0c;表意文绉绉&#xff0c;你可以理解为能够组装…

Docker+Jenkins+Gitlab+SpringBoot 自动化部署项目

我这边Docker、Jenkins、Gitlab 都已准备完毕&#xff0c;Jenkins和GItlab 都是用Docker起的 我们先进入Jenkins&#xff0c;插件什么的按他推荐的装就可以了&#xff0c;另外使用gitlab,还需要额外安装下面的插件 然后我们开始在Jenkins上创建项目 然后点保存&#xff0c;接下…

行业说 | 建筑业面临失宠,越来越留不住年轻人?原因在这

大家好&#xff0c;这里是建模助手。 不知道大家有没有发现&#xff0c;现在建筑行业存在着一种现象&#xff0c;就是&#xff1a;年轻人建筑行业“不想去”&“留不住”。 在这种情况下&#xff0c;行业的老龄化趋势便愈发明显&#xff0c;据数据显示&#xff1a; 2021年…

跬智信息(Kyligence)荣登「甲子20」中国数据智能领域最具商业潜力科技企业榜

近日&#xff0c;为表彰中国科技产业与数字经济领域的杰出贡献者&#xff0c;中国科技产业智库甲子光年在 2022「甲子引力」年终盛典上公布多项榜单。凭借在数据智能领域的核心技术优势与高成长性的商业价值表现&#xff0c;跬智信息&#xff08;Kyligence&#xff09;最终荣登…

【C++11】三大神器之——包装器和绑定器

前言 如果你还不知道 C 11 引入的包装器和绑定器是什么&#xff0c;可以读读这篇文章&#xff0c;看看有什么 启发&#xff1b;如果你已经对包装器和绑定器了如指掌&#xff0c;也可以读读这篇文章&#xff0c;看看有什么 补充。欢迎交流~&#x1f60f; 可调用对象 C中存在【…

PCB叠层当中的“假八层”是什么意思呢?

大家在进行PCB设计的时候都是需要对我们的板子选择叠层方案的&#xff0c;一个好的层叠方案能使我们的信号质量变好&#xff0c;板子性能也会更稳定等等&#xff0c;大家可能或多或少的接触过多层板&#xff0c;也就是两层往上的板子&#xff0c;那么大家在做六层板的时候是否有…

Servlet:狂神Response源码分析【文件下载 + 动态图形验证码 + 重定向】

目录web.xmlindex.jspRequestTestlogin测试FileServlet文件下载测试动态图形验证码Servlet动态图形验证码测试总结web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi&quo…

15-16-17 - 保护模式中的特权级

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 保护模式小结1.1 使用选择子访问段描述符表时&#xff0c;索引值的合法性检测1.2 内存段类型合法性检测1.3 实例分析2. 问题一3. 保护模式中的特权级3.1 特权级的表现形式3.2 初探特权级3.2.1 CPL和DPL的关系3.2.2 段描述符中的D…

手把手教你Spring Cloud Alibaba教程:使用nacos实现服务注册与发现

我们在上一篇&#xff1a;手把手教你Spring Cloud Alibaba教程:nacos安装 接下来我们来实现下基本的服务注册和发现 版本确认 我们需要确认spring Cloud Alibaba version对应的nacso version 主要如下 版本说明 alibaba/spring-cloud-alibaba Wiki Spring Cloud Alibaba Ve…

图解:基于HyperWorks螺纹升角的六面体划分攻略

导读&#xff1a;在实际工程应用中&#xff0c;基于HyperWorks六面体工程命令&#xff0c;对工程师朋友来说比较繁琐&#xff0c;甚至不容易掌握。于是经常参加一些线下培训&#xff0c;用以提升自己业务技能。今天&#xff0c;笔者从一个企业资深培训讲师的角度&#xff0c;结…

Docker安装Oracle

Docker安装Oracle 本次使用的系统是centOS7 &#xff08;文章部分参考&#xff1a;地址&#xff09; 安装Docker docker安装要求&#xff1a;CentOS内核版本高于3.10&#xff0c;可以通过命令 uname -r查看当前内核版本 下载工具 yum install -y yum-utils设置阿里云镜像 …

【MySQL】使用C语言连接数据库

文章目录下载Mysql的C接口库程序中引入Mysql头文件和库文件**Mysql接口介绍**创建句柄链接数据库设置字符编码执行SQL语句关闭链接mysql.ops.cc下载Mysql的C接口库 要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以官网下载,实际上连接数据库的功能在mysql 8.0版本之…

(十五)Vue之过滤器

文章目录计算属性实现methods实现过滤器实现局部过滤器不传参传参多个过滤器使用全局过滤器Vue学习目录 上一篇&#xff1a;&#xff08;十四&#xff09;Vue之收集表单数据 先看一个需求&#xff1a;给一个时间戳&#xff0c;然后把时间戳格式化显示出来 时间戳数据&#xf…

哈希表题目:相交链表

文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法证明代码复杂度分析题目 标题和出处 标题&#xff1a;相交链表 出处&#xff1a;160. 相交链表 难度 2 级 题目描述 要求 给你两个单链表的头结点 headA\texttt…

web网页设计期末课程大作业 基于HTML+CSS仿苹果商城电商项目的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

Thread类和线程状态

目录 Thread 的常见构造方法 Thread 的几个常见属性 经典面试题&#xff1a;start和run的区别 interrupt 线程中断 join 线程等待 currentThread 获得当前这个线程对应的 Thread 对象的引用。 sleep 置顶休眠的时间(阻塞一会) sleep(1000)&#xff0c;真的只是休眠1000…

使用 MindStudio进行基于 MindX SDK 辅助驾驶项目的开发

视频链接&#xff1a;https://www.bilibili.com/video/BV1K8411p7Cm/ 1 任务介绍 ASSISTED-DRIVING的中文含义为辅助驾驶&#xff0c;其先采用了yolov3模型将图片中的交通标志检测出来&#xff0c;然后利用resnet18模型获对检测出来的交通标志进行分类&#xff1b;在道路线分…

0-1规划下的数独问题

数独显然是一个0-1规划问题.虽然这个什么凸分析还是啥的分析有这个优化的方法,但是,你DFS也不是完全一点不可能的对吧.嗯,既然这样的话,我们就要去解决这样一个更细致的问题了.数独这个问题他的解的存在性,唯一性怎么样.当然,已经有结论了,一个9*9的数独至少要给出17个值才能约…

Qt扫盲-QGridLayout理论总结

QGridLayout理论总结1. 简介2. 操作布局元素3. 常用属性4. 间隔设置1. 简介 QGridLayout 占用来自其父布局或 parentWidget()获得的空间&#xff0c;将其划分为行列表格形式&#xff0c;在每个布局的表格里放置控件或者布局器就行。 一般来说&#xff0c;列和行的行为功能相同…