语言过滤器(SpringCloud Gateway自带的全局过滤器GlobalFilter是怎样的)

发布时间:2025-12-11 00:45:38 浏览次数:1

全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证、IP 访问限制等。

接口定义类 org.springframework.cloud.gateway.filter.GlobalFilter,具体代码如下所示。

publicinterfaceGlobalFilter{Mono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain);}

SpringCloudGateway 自带的 GlobalFilter 实现类有很多,如图 1 所示。

有转发、路由、负载等相关的 GlobalFilter,感兴趣的朋友可以去看下源码自行了解。我们如何通过定义 GlobalFilter 来实现我们的业务逻辑?

这里给出一个官方文档上的案例,代码如下所示。

@ConfigurationpublicclassExampleConfiguration{privateLoggerlog=LoggerFactory.getLogger(ExampleConfiguration.class);@Bean@Order(-1)publicGlobalFiltera(){return(exchange,chain)->{log.info("firstprefilter");returnchain.filter(exchange).then(Mono.fromRunnable(()->{log.info("thirdpostfilter");}));};}@Bean@Order(0)publicGlobalFilterb(){return(exchange,chain)->{log.info("secondprefilter");returnchain.filter(exchange).then(Mono.fromRunnable(()->{log.info("secondpostfilter");}));};}@Bean@Order(1)publicGlobalFilterc(){return(exchange,chain)->{log.info("thirdprefilter");returnchain.filter(exchange).then(Mono.fromRunnable(()->{log.info("firstpostfilter");}));};}}

上面定义了 3 个 GlobalFilter,通过@Order来指定执行的顺序,数字越小,优先级越高。下面就是输出的日志,从日志就可以看出执行的顺序,如下所示。

2019-8-2616:08:52.406INFO55062---[ioEventLoop-4-1]c.c.gateway.config.ExampleConfiguration:firstprefilter2019-8-2616:08:52.406INFO55062---[ioEventLoop-4-1]c.c.gateway.config.ExampleConfiguration:secondprefilter2019-8-2616:08:52.407INFO55062---[ioEventLoop-4-1]c.c.gateway.config.ExampleConfiguration:thirdprefilter2019-8-2616:08:52.437INFO55062---[ctor-http-nio-7]c.c.gateway.config.ExampleConfiguration:firstpostfilter2019-8-2616:08:52.438INFO55062---[ctor-http-nio-7]c.c.gateway.config.ExampleConfiguration:secondpostfilter2019-8-2616:08:52.438INFO55062---[ctor-http-nio-7]c.c.gateway.config.ExampleConfiguration:thirdpostfilter

当 GlobalFilter 的逻辑比较多时,笔者还是推荐大家单独写一个 GlobalFilter 来处理,比如我们要实现对 IP 的访问限制,即不在 IP 白名单中就不能调用的需求。

单独定义只需要实现 GlobalFilter、Ordered 两个接口就可以了,具体代码如下所示。

@ComponentpublicclassIPCheckFilterimplementsGlobalFilter,Ordered{@OverridepublicintgetOrder(){return0;}@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){HttpHeadersheaders=exchange.getRequest().getHeaders();//此处写得非常绝对,只作演示用,实际中需要采取配置的方式if(getIp(headers).equals("127.0.0.1")){ServerHttpResponseresponse=exchange.getResponse();ResponseDatadata=newResponseData();data.setCode(401);data.setMessage("非法请求");byte[]datas=JsonUtils.toJson(data).getBytes(StandardCharsets.UTF_8);DataBufferbuffer=response.bufferFactory().wrap(datas);response.setStatusCode(HttpStatus.UNAUTHORIZED);response.getHeaders().add("Content-Type","application/json;charset=UTF-8");returnresponse.writeWith(Mono.just(buffer));}returnchain.filter(exchange);}//这里从请求头中获取用户的实际IP,根据Nginx转发的请求头获取privateStringgetIp(HttpHeadersheaders){return"127.0.0.1";}}

过滤的使用虽然比较简单,但作用很大,可以处理很多需求,上面讲的 IP 认证拦截只是冰山一角,更多的功能需要我们自己基于过滤器去实现。

看完上述内容,你们掌握Gateway的全局过滤器GlobalFilter是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注本站行业资讯频道,感谢各位的阅读!

语言过滤器
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477