SpringCloud Gateway过滤器工厂配置及自定义过滤器工厂
SpringCloud Gateway 内置的过滤工厂:
官方文档:
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories
过滤器工厂
|
作用
|
参数
|
AddRequestHeader
|
为原始请求添加Header
|
Header的名称及值
|
AddRequestParameter
|
为原始请求添加请求参数
|
参数名称及值
|
AddResponseHeader
|
为原始响应添加Header
|
Header的名称及值
|
DedupeResponseHeader
|
剔除响应头中重复的值
|
需要去重的Header名称及去重策略
|
Hystrix
|
为路由引入Hystrix的断路器保护
|
HystrixCommand 的名称
|
FallbackHeaders
|
为fallbackUri的请求头中添加具体的异常信息
|
Header的名称
|
PrefixPath
|
为原始请求路径添加前缀
|
前缀路径
|
PreserveHostHeader
|
为请求添加一个preserveHostHeader=true 的 属 性,路由过滤器会检查该属性以决定是否要发送原始的Host
|
无
|
RequestRateLimiter
|
用于对请求限流,限流算法为令牌桶
|
keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus
|
RedirectTo
|
将原始请求重定向到指定的URL
|
http状态码及重定向的url
|
RemoveHopByHopHeadersFilter
|
为原始请求删除IETF组织规定的一系列Header
|
默认就会启用,可以通过配置指定仅删除哪些Header
|
RemoveRequestHeader
|
为原始请求删除某个Header
|
Header名称
|
RemoveResponseHeader
|
为原始响应删除某个Header
|
Header名称
|
RewritePath
|
重写原始的请求路径
|
原始路径正则表达式以及重写后路径的正则表达式
|
RewriteResponseHeader
|
重写原始响应中的某个Header
|
Header名称,值的正 则表达式,重写后的值
|
SaveSession
|
在转发请求之前,强制执行
WebSession::save 操作
|
无
|
secureHeaders
|
为原始响应添加一系列起安全作用的响应头
|
无,支持修改这些安全响应头的值
|
SetPath
|
修改原始的请求路径
|
修改后的路径
|
SetResponseHeader
|
修改原始响应中某个Header的值
|
Header名称,修改后的值
|
SetStatus
|
修改原始响应的状态码
|
HTTP 状态码,可以是数字,也可以是字符串
|
StripPrefix
|
用于截断原始请求的路径
|
使用数字表示要截断的路径的数量
|
Retry
|
针对不同的响应进行重试
|
retries、statuses、methods、series
|
RequestSize
|
设置允许接收最大请求包的大 小。如果请求包大小超过设置的值,则返回 413 Payload Too
Large
|
请求包大小,单位为字节,默认值为5M
|
ModifyRequestBody
|
在转发请求之前修改原始请求体内容
|
修改后的请求体内容
|
ModifyResponseBody
|
修改原始响应体的内容
|
修改后的响应体内容
|
自定义过滤器:
自定义过滤器:继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理
过滤器代码:
package com.geteway.vn.filter; 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; /** * @author vn * @version 1.0 * @date 2022/3/14 21:54 */ @Component public class CheckAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> { public CheckAuthGatewayFilterFactory() { super(Config.class); } @Override public List<String> shortcutFieldOrder() { return Arrays.asList("value"); } @Override public GatewayFilter apply(Config config) { return new GatewayFilter() { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String name=exchange.getRequest().getQueryParams().getFirst("name"); if(StringUtils.isNotBlank(name)){ if(config.getValue().equals(name)){ return chain.filter(exchange); } else { // 返回404 exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND); return exchange.getResponse().setComplete(); } } // 正常请求 return chain.filter(exchange); } }; } public static class Config { private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } } }
配置文件:
server: port: 8088 spring: application: name: api-gateway cloud: gateway: # gateway的配置 routes: #路由规则 - id: order_route # 路由的唯一标识,路由到order uri: lb://order-service #需要转发的地址 lb: 使用nacos中的本地负载均衡策略 order-service服务名 predicates: #断言规则 用于路由规则的匹配 - Path=/order-serv/** # http://localhost:8088/order-serv/vn/order 路由转到 http://localhost:80/order-serv/vn/order filters: - StripPrefix=1 # 转发之前去掉1层路径 变成 -> http://localhost:80/vn/order - AddRequestHeader=X-Request-color, red #添加请求头 - PrefixPath=/order-ser # 添加前缀 对应微服务需要配置context-path - CheckAuth=vn # 为自定义过滤器 # - RedirectTo=302, https://www.baidu.com/ nacos: server-addr: 192.168.43.197:8848 discovery: username: nacos password: nacos