当前位置: 首页 > news >正文

网关(Gateway)- 自定义过滤器工厂

自定义过滤工厂类

DemoGatewayFilterFactory

package com.learning.springcloud.custom;import org.apache.commons.lang.StringUtils;
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.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Arrays;
import java.util.List;@Component
public class DemoGatewayFilterFactory extends AbstractGatewayFilterFactory<DemoGatewayFilterFactory.Config> {public DemoGatewayFilterFactory() {super(Config.class);}public List<String> shortcutFieldOrder() {return Arrays.asList("name", "value");}@Overridepublic GatewayFilter apply(DemoGatewayFilterFactory.Config config) {return new GatewayFilter() {public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String value = exchange.getRequest().getQueryParams().getFirst("name");if (StringUtils.isBlank(value)) {// 为空 则证明是正常的请求 需要放行return chain.filter(exchange);}if ("YES".equals(value)) {return chain.filter(exchange);}exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);return exchange.getResponse().setComplete();}};}public static class Config {private String name;private String value;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getValue() {return value;}public void setValue(String name) {this.value = name;}}
}

过滤器配置说明

server:port: 8088
spring:application:name: api-gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8847username: nacospassword: nacosgateway:routes:- id: order_route # 路由唯一标识#uri: http://localhost:8020 # 需要转发的地址uri: lb://order-service # 需要转发的地址# 断言规则  用于路由规则的匹配predicates:
#            - Path=/order-serv/**
#            - After=2024-01-01T23:00:11.518+08:00[Asia/Shanghai]
#            - Before=2025-01-01T23:00:11.518+08:00[Asia/Shanghai]- Between=2024-01-01T23:00:11.518+08:00[Asia/Shanghai],2025-01-01T23:00:11.518+08:00[Asia/Shanghai]
#            - Header=X-Request-Id,\d+
#            - Host=127.0.0.1
#            - Query=name,lq
#            - Method=GET,POST# http://localhost:8088/order-serv/order/add  => http://localhost:8020/order-serv/order/add- Demo=YES#配置过滤器工厂filters:- StripPrefix=1 # 转发去掉第一层路径- AddRequestHeader=X-Request-name,tom #添加请求头- AddRequestParameter=color, blue # 添加请求参数- PrefixPath=/demo
#            - RedirectTo=302, https://www.baidu.com/ #重定向到百度- Demo=name,YES  # 自定义过滤工厂配置# http://localhost:8020/order-serv/order/add => http://localhost:8020/order/add

访问效果

  • 不带name参数的请求放行

  • 带name参数值不是YES的拦截,返回 not found

  • 带name参数值是YES的放行

实现说明 

  • 命名必须需要以 FilterFactory 结尾(约定规范)
  • 继承 AbstractGatewayFilterFactory 类
  • 必须为spring的组件bean(@Component)
  • 必须要有内部类 Config 以及 对应的 shortcutFieldOrder 方法
  • 重写 apply 方法的逻辑 (apply(DemoGatewayFilterFactory.Config config))
  • 可通过 exchange.getRequest() 获取到 ServerHttpRequest 对象
  • 从而获取到请求的参数、请求方式、请求头等信息

相关文章:

  • 基于安卓的虫害识别软件设计--(2)模型性能可视化|混淆矩阵、热力图
  • 【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版6(附带项目源码)
  • x264 参考帧管理原理:b_ref_reorder 数组变量
  • Vue:路由管理vue-router
  • 信息标记形式 (XML, JSON, YAML)
  • DeepFace ——用于高级人脸识别算法探索与应用
  • 【Python】Python异步编程
  • FFmpeg 中 Filters 使用文档介绍
  • 纯网络的系统能否定级备案?
  • 易基因:RNA免疫共沉淀测序 (RIP-seq) 技术介绍
  • 【Java数据结构】详解Stack与Queue(二)
  • MTK 平台项目security boot 开启/关闭 及 系统签名流程
  • autowired注解底层实现代码
  • Ant Design Vue Pro流程分析记录
  • JMeter源码解析之SplashScreen.java
  • Android组件 - 收藏集 - 掘金
  • angular组件开发
  • bearychat的java client
  • CSS中外联样式表代表的含义
  • Debian下无root权限使用Python访问Oracle
  • DOM的那些事
  • egg(89)--egg之redis的发布和订阅
  • leetcode46 Permutation 排列组合
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Objective-C 中关联引用的概念
  • React-redux的原理以及使用
  • 构建工具 - 收藏集 - 掘金
  • 今年的LC3大会没了?
  • 判断客户端类型,Android,iOS,PC
  • 微信公众号开发小记——5.python微信红包
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 小试R空间处理新库sf
  • 学习使用ExpressJS 4.0中的新Router
  • 应用生命周期终极 DevOps 工具包
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​ubuntu下安装kvm虚拟机
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #### golang中【堆】的使用及底层 ####
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #QT(QCharts绘制曲线)
  • #stm32整理(一)flash读写
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (1)bark-ml
  • (2)空速传感器
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十八)Flink CEP 详解
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (总结)(2)编译ORB_SLAM2遇到的错误