GateWay过滤器工厂( GatewayFilter Factories)配置

267 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

一、GateWay过滤器工厂

Gateway 内置了很多的过滤器工厂,我们通过一些过滤器工厂可以进行一些业务逻辑处理器,比如添加剔除响应头,添加去除参数等

image.png

官方提供的过滤器工厂有33个之多,可以看下官网地址: docs.spring.io/spring-clou…

过滤器工厂作用参数
AddRequestHeader为原始请求添加HeaderHeader的名称及值
AddRequestParameter为原始请求添加请求参数参数名称及值
AddResponseHeader为原始响应添加HeaderHeader的名称及值
 DedupeResponseHeader 剔除响应头中重复的值需要去重的Header名称及去重策略
 Hystrix为路由引入Hystrix的断路器保护HystrixCommand 的名称
 FallbackHeaders为fallbackUri的请求头中添加具体的异常信息Header的名称
PrefixPath为原始请求路径添加前缀前缀路径
 PreserveHostHeader为请求添加一个preserveHostHeader=true 的 属 性,路由过滤器会检查该属性以决定是否要发送原始的Host 无
  RequestRateLimiter 用于对请求限流,限流算法为令牌桶keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus
 RedirectTo将原始请求重定向到指定的URLhttp状态码及重定向的url
 RemoveHopByHopHeadersFilter 为原始请求删除IETF组织规定的一系列Header默认就会启用,可以通过配置指定仅删除哪些Header
RemoveRequestHeader为原始请求删除某个HeaderHeader名称
RemoveResponseHeader为原始响应删除某个HeaderHeader名称
 RewritePath 重写原始的请求路径原始路径正则表达式以及重写后路径的正则表达式
 RewriteResponseHeader重写原始响应中的某个HeaderHeader名称,值的正 则表达式,重写后的值
 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参数,然后再发送到服务中 image.png

2-1-2、编写接口代码

@RequestMapping("/get")
public String get(@RequestHeader("X-Request-color") String color){
    return color;
}

2-1-3、访问测试

可以看到这样在GateWay的配置文件中添加的Header就成功添加上了 image.png

2-2、PrefixPath为匹配的路由统一添加前缀

通过PrefixPath就可以给路由添加统一前缀,比如被访问项目的路径为:

http://localhost:8070/seata-order/order/add

但是在访问GateWay的时候我们不想添加seata-order,而是访问:

http://localhost:8088/order/add

下面就来进行处理一下。

2-2-1、给被调用服务添加context-path

image.png

2-2-1、访问添加context-path后的微服务

image.png

2-2-3、配置GateWay服务的前缀过滤器

通过设置PrefixPath设置前缀名称 image.png

2-2-4、访问GateWay服务

可以看到路径中是没有context-path设置的myorder的 image.png

2-3、RedirectTo重定向

2-3-1、在application.yml中配置重定向

通过设置RedirectTo,让请求重定向到百度 image.png

2-3-2、访问测试

通过访问我本地

http://localhost:8088/myorder/order/add

就可以重定向到

www.baidu.com

三、自定义过滤器工厂

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

image.png

3-3、测试访问

有name参数,但是值不是jony,返回404 image.png

有name参数,并且值是jony,可以正常访问 image.png

没有name参数,可以正常访问 image.png