携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
一、GateWay过滤器工厂
Gateway 内置了很多的过滤器工厂,我们通过一些过滤器工厂可以进行一些业务逻辑处理器,比如添加剔除响应头,添加去除参数等
官方提供的过滤器工厂有33个之多,可以看下官网地址: docs.spring.io/spring-clou…
| 过滤器工厂 | 作用 | 参数 |
|---|---|---|
| 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 TooLarge | 请求包大小,单位为字节,默认值为5M |
| ModifyRequestBody | 在转发请求之前修改原始请求体内容 | 修改后的请求体内容 |
| ModifyResponseBody | 修改原始响应体的内容 | 修改后的响应体内容 |
二、经常使用的过滤器工厂
下面来使用一下经常使用的过滤器工厂
2-1、AddRequestHeader过滤器
通过AddRequestHeader可以给原始请求添加Header信息
2-1-1、在application.yml中配置添加Header信息
如下就可以给请求添加Header参数,然后再发送到服务中
2-1-2、编写接口代码
@RequestMapping("/get")
public String get(@RequestHeader("X-Request-color") String color){
return color;
}
2-1-3、访问测试
可以看到这样在GateWay的配置文件中添加的Header就成功添加上了
2-2、PrefixPath为匹配的路由统一添加前缀
通过PrefixPath就可以给路由添加统一前缀,比如被访问项目的路径为:
http://localhost:8070/seata-order/order/add
但是在访问GateWay的时候我们不想添加seata-order,而是访问:
http://localhost:8088/order/add
下面就来进行处理一下。
2-2-1、给被调用服务添加context-path
2-2-1、访问添加context-path后的微服务
2-2-3、配置GateWay服务的前缀过滤器
通过设置PrefixPath设置前缀名称
2-2-4、访问GateWay服务
可以看到路径中是没有context-path设置的myorder的
2-3、RedirectTo重定向
2-3-1、在application.yml中配置重定向
通过设置RedirectTo,让请求重定向到百度
2-3-2、访问测试
通过访问我本地
http://localhost:8088/myorder/order/add
就可以重定向到
三、自定义过滤器工厂
3-1、创建自定义过滤器工厂
创建过滤器和创建断言基本类似,找一个过滤器复制过来,然后进行修改即可,需要注意的是:
1、必须将过滤器作为Bean、
2、名称必须以GatewayFilterFactory结尾
3、需要继承AbstractGatewayFilterFactory
下面的过滤器主要实现获得请求参数name的值,在没传或者值为jony的时候才进行放行。否则就返回404
@Component
public class CheckAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> {
public CheckAuthGatewayFilterFactory() {
super(CheckAuthGatewayFilterFactory.Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("value");
}
@Override
public GatewayFilter apply(CheckAuthGatewayFilterFactory.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{
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;
}
}
}
3-2、配置application.yml
3-3、测试访问
有name参数,但是值不是jony,返回404
有name参数,并且值是jony,可以正常访问
没有name参数,可以正常访问