GlobalFilter与AbstractGatewayFilterFactory

发布时间 2023-11-20 15:06:51作者: 陈雨学习之路

GlobalFilter:全局过滤器(接口)

AbstractGatewayFilterFactory:局部过滤器(抽象类)

 

java8中已经写了几个特定过滤器

全局过滤器:

 

局部过滤器:

序号 过滤器 作用 参数名 参数值 示例(filters配置) 备注
1 AddRequestHeader 添加请求头 name,value 添加的请求头及其值 AddRequestHeader=X-Request-red, blue
2 AddRequestParameter 在Query String中添加请求参数,参数值可以是变量,具体值可以从PATH或Host中匹配 name,value 添加的参数名及其值 AddRequestParameter=foo, bar-{segment}
3 AddResponseHeader 添加响应头 name,value 添加的响应头及其值 AddResponseHeader=X-Response-Red, Blue
4 DedupeResponseHeader 过滤重复响应头 name,strategy 需要过滤的响应头及策略(保留第一个,保留最后一个,保留唯一值) DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
5 CircuitBreaker 熔断器 name,fallbackUri,statusCodes 熔断器名称、熔断后的默认URI、熔断触发状态 #NAME? 使用熔断器需配置spring-cloud-starter-circuitbreaker-reactor-resilience4j,详见Resilience4J Documentation
6 FallbackHeaders 指定发生熔断时fallback响应头 executionExceptionTypeHeaderName, executionExceptionMessageHeaderName, rootCauseExceptionTypeHeaderName, rootCauseExceptionMessageHeaderName 异常类型、详情、根因类型、根因详情等响应头名称 executionExceptionTypeHeaderName: Test-Header
7 MapRequestHeader 添加新的请求头,值从已有请求头中获取 fromHeader,toHeader 已有请求头名称,新请求头名称 MapRequestHeader=Blue, X-Request-Red
8 PrefixPath 请求路径增加前缀 prefix 需增加的前缀 PrefixPath=/mypath
9 PreserveHostHeader 配置是否将原始请求头发送到服务方 - - PreserveHostHeader
10 RequestRateLimiter 请求频度控制 - - 默认提供了基于Redis的频度控制过滤器,也可以自定义
11 RedirectTo 重定向过滤器 status,url 重定向http status及重定向后的url RedirectTo=302, https://acme.org
12 RemoveRequestHeader 删除请求头 name 待删除的请求头 RemoveRequestHeader=X-Request-Foo
13 RemoveResponseHeader 删除响应头 name 待删除的响应头 RemoveResponseHeader=X-Response-Foo
14 RemoveRequestParameter 删除请求参数 name 待删除的请求参数名 RemoveRequestParameter=red
15 RewritePath 重写PATH regexp,replacement 重写部分匹配规则,需替换的值 RewritePath=/red/?(?<segment>.*), /$\{segment} 匹配规则采用正则表达式,替换值支持从匹配中获取
16 RewriteLocationResponseHeader 重写响应头中的Location stripVersionMode, locationHeaderName, hostValue, protocolsRegex path中version处理模式,location响应头名称,host值,url协议头 RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
17 RewriteResponseHeader 重写响应头 name,regexp,replacement 响应头名称,需修改值的匹配规则,需替换的值 RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
18 SaveSession 强制触发WebSession::save - - SaveSession
19 SecureHeaders 添加一组安全相关的头信息到响应中 - - SecureHeaders
20 SetPath 设置请求path template path模板 SetPath=/{segment}
21 SetRequestHeader 设置请求头(不添加新的) name,value 请求头及其值 SetRequestHeader=X-Request-Red, Blue
22 SetResponseHeader 设置响应头(不添加新的) name,value 响应头及其值 SetResponseHeader=X-Response-Red, Blue
23 SetStatus 设置响应状态 status 响应状态 SetStatus=401
24 StripPrefix 截断请求PATH parts 需截断的长度(’/'个数) StripPrefix=2
25 Retry 重试过滤器 - - - 详细配置
26 RequestSize 限流器 maxSize 请求最大报文大小 maxSize: 5000000
27 SetRequestHostHeader 设置请求host host 分组及权重 SetRequestHostHeader=example.org
28 ModifyRequestBody 修改请求报文 - - - 只能通过 Java DSL 配置
29 ModifyResponseBody 修改响应报文 - - - 只能通过 Java DSL 配置
30 TokenRelay 配合OAuth2使用 - - TokenRelay=
31 CacheRequestBody 根据权重进行路由 bodyClass 请求体类型 - 详细配置

 

当然如果可以自定义实现

全局过滤器:implements GlobalFilter(实现)

局部过滤器:extends AbstractGatewayFilterFactory (继承)

GlobalFilter中如果需要区别是前置还是后置,则需要注意chain.filter(exchange).then()的位置,该方法后的方法体为后置,前面的为前置

如果自定义了多个过滤器,需要区分先后执行顺序,则需要重写getOrder方法并赋值,数字越低优先级越高

AbstractGatewayFilterFactory 自定义过滤器需在网关的yaml文件中进行配置,否则不生效

例如:


spring:
cloud:
gateway:
routes: #1路由
- id: producer-one
uri: lb://producter-one
predicates: #2通过path断言
- Path=/*/producterone/**
filters: #局部过滤器,如果是全局过滤器可以不用配置
- StripPrefix=1
- name: mycustomlocalfiter
args:
paramname: "this is paramName"
paramvalue: "this is paramValue"
- id: producer-two
uri: http://localhost:8080
predicates:
- Path=/*/productertwo/
filters: