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

Spring Cloud全解析:网关之GateWay过滤器

GateWay过滤器

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,只能指定路由进行使用,由GatewayFilter的工厂类来产生,Gateway官方提供了很多的路由过滤器,也可以实现自己的自定义过滤器

内置过滤器

请求头/响应头过滤器
  • AddRequestHeaderGatewayFilterFactory

  • AddResponseHeaderGatewayFilterFactory

  • DedupeResponseHeaderGatewayFilterFactory 处理重复响应头

    有三种策略 RETAIN_FIRST、RETAIN_LAST、RETAIN_UNIQUE

    spring:cloud:gateway:default-filters:- DedupeResponseHeader=Access-Control-Allow-Credentials, RETAIN_LAST #规则写在最后
    
  • PreserveHostHeaderGatewayFilterFactory

  • RemoveRequestHeaderGatewayFilterFactory

  • RemoveResponseHeaderGatewayFilterFactory

  • RequestHeaderSizeGatewayFilterFactory

  • SecureHeadersGatewayFilterFactory

  • SetRequestHeaderGatewayFilterFactory

  • SetResponseHeaderGatewayFilterFactory

请求参数过滤器
  • AddRequestParameterGatewayFilterFactory

    spring:cloud:gateway:default-filters:- AddRequestHeader=X-Request-red, blue
    
  • RemoveRequestParameterGatewayFilterFactory

路径过滤器
  • PrefixPathGatewayFilterFactory 为匹配的url添加指定前缀

    spring:cloud:gateway:default-filters:- PrefixPath=/mypath # 增加指定前缀,如/hello变成/mypath/hello
    
  • RewritePathGatewayFilterFactory 采用正则表达式替换参数

    spring:cloud:gateway:default-filters:- RewritePath=/red/?(?<segment>.*), /$\{segment} # 两个参数,一个是请求路径的正则表达式,一个是替换的路径参数,如/red/blue会变成/blue
    
  • SetPathGatewayFilterFactory

  • StripPrefixGatewayFilterFactory 在将请求发送到下游之前从请求中剥离的路径个数

    spring:cloud:gateway:default-filters:- StripPrefix=2 # 如/mypath/red/blue会变成/blue
    
请求体/响应体过滤器
  • RequestSizeGatewayFilterFactory
响应状态过滤器
  • SetStatusGatewayFilterFactory

    spring:cloud:gateway:default-filters:- SetStatus=401
    
会话过滤器
  • SaveSessionGatewayFilterFactory
重定向过滤器
  • RedirectToGatewayFilterFactory
重试过滤器
  • RetryGatewayFilterFactory
限流过滤器
  • RequestRateLimiterGatewayFilterFactory

自定义

自定义全局过滤器

实现自定义的全局过滤器,需要实现GlobalFilter和Ordered接口,全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,为请求业务以及路由的 URI 转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("过滤器进入");String token = exchange.getRequest().getQueryParams().getFirst("token");if(StringUtils.isBlank(token)){System.out.println("不包含token");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// 继续执行过滤器链return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

全局过滤器不需要在配置文件中配置

自定义网关过滤器
实现GatewayFilter方式

需要实现GatewayFilter和Ordered接口

@Component
public class MyCustomFilter implements GatewayFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("自定义过滤器进入");// 继续执行过滤器链return chain.filter(exchange);}@Overridepublic int getOrder() {return 0;}
}

需要使用java编码来配置自定义过滤器

@Configuration
public class MyConfig {/**配置自定义过滤器*/@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder builder) {return builder.routes().route(r ->r.path("/provider/**")//用户访问的路径.uri("lb://service-provider")//路由的真实服务器ip+端口.filters(new MyCustomFilter()) // 局部过滤器.id("provider_route")) // 路由id.build();}
}

使用GatewayFilter还需要硬编码,不太好用,那么有没有更方便的方式呢?

继承AbstractGatewayFilterFactory
public class MyCustomGatewayFilterFactory extends AbstractGatewayFilterFactory<MyCustomGatewayFilterFactory.Config> {public MyCustomGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config, Class<Config> configClass) {// 在这里创建并返回过滤器实例return (exchange, chain) -> {// 过滤器逻辑return chain.filter(exchange);};}public static class Config {// 过滤器的配置参数}
}

配置

spring:cloud:gateway:routes:- id: myuri: http://example.comfilters:- MyCustom=1predicates:- Path=/api/**

https://zhhll.icu/2021/框架/微服务/springcloud/网关/GateWay/3.GateWay过滤器/

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • RASA使用长文记录以及一些bug整理
  • 鸿蒙启动框架配置文件(StartUpTask)
  • 学习记录:js算法(二十一):字符串的排列、替换后的最长重复字符
  • YOLOv9改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
  • 前端内存泄露案例与解决方案
  • Ubuntu 安装个人热点
  • 字符集介绍
  • 八、2 DMA数据转运 DMA函数介绍
  • 使用 streamlink 把 m3u8 转为 mp4
  • 如何使用IDEA搭建Mybatis框架环境(详细教程)
  • 什么是USB?
  • 前端配置环境
  • RabbitMQ 入门:基本概念、特性及简单示例
  • 开学季老师如何发布分班?
  • 奇偶校验、crc循环冗余检验
  • centos安装java运行环境jdk+tomcat
  • go语言学习初探(一)
  • iOS 颜色设置看我就够了
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Vue--数据传输
  • windows下使用nginx调试简介
  • 关于 Cirru Editor 存储格式
  • 解决iview多表头动态更改列元素发生的错误
  • 聊聊directory traversal attack
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端之React实战:创建跨平台的项目架构
  • 前嗅ForeSpider中数据浏览界面介绍
  • 一文看透浏览器架构
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #pragma预处理命令
  • (02)Unity使用在线AI大模型(调用Python)
  • (02)vite环境变量配置
  • (07)Hive——窗口函数详解
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (三)模仿学习-Action数据的模仿
  • (正则)提取页面里的img标签
  • (转)为C# Windows服务添加安装程序
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NetCore发布到IIS
  • .Net多线程Threading相关详解
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @javax.ws.rs Webservice注解
  • @Validated和@Valid校验参数区别
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [2024-06]-[大模型]-[Ollama]- WebUI
  • [ai笔记9] openAI Sora技术文档引用文献汇总