介绍

:::tips GlobalFilter称为全局过滤器,与GatewayFilter一样,也是处理一切进入网关的请求和微服务响应

GatewayFilter是通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑是通过代码实现的

SpringCloudGateway核心的功能也是通过内置的全局过滤器来完成的
image.png :::

使用

:::tips 当系统默认的过滤器满足不了业务的时候,可以自定义过滤器,既可以自定义全局过滤器,也可以自定义局部过滤器。自定义局部的很少使用,下面演示的是全局过滤器的使用

先创建一个过滤器类,继承GlobalFilter接口(编写过滤规则)、Ordered接口(决定过滤器的顺序),然后重写这两个接口提供的方法 :::

  1. //注册到Spring容器
  2. @Component
  3. public class XxxFilter implements GlobalFilter,Ordered {
  4. /**
  5. * 过滤规则,来源于GlobalFilter接口
  6. *
  7. * @param exchange: 获得web对象的 eg: 请求对象 响应对象
  8. * @param chain: 过滤器链
  9. * @return
  10. */
  11. @Override
  12. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  13. //获取请求对象、响应对象
  14. ServerHttpRequest request = exchange.getRequest();
  15. ServerHttpResponse response = exchange.getResponse();
  16. //拦截请求的逻辑
  17. //响应状态码,HttpStatus.UNAUTHORIZED是状态码401
  18. response.setStatusCode(HttpStatus.UNAUTHORIZED);
  19. //完成响应
  20. return response.setComplete();
  21. //放行的逻辑
  22. return chain.filter(exchange);
  23. }
  24. /**
  25. * 定义过滤器顺序的方法,来源于Ordered接口
  26. *
  27. * @return 返回值越小,优先级越高
  28. */
  29. @Override
  30. public int getOrder() {
  31. return 0;
  32. }
  33. }