(四)Gateway开发教程之自定义网关过滤器

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

前情回顾

上篇文章,我们讲到了Gateway中的路由如何配置,及如何去细致的匹配相应的访问链接等知识点,这些就足以让我们入门Gateway的开发了。

但是,需求是不断迭代的,所以要使用更多Gateway中提供的一些特性功能等,今天就和大家聊一下Gateway提供的网关过滤器。

Gateway提供了哪些过滤器类型

Gateway中一共提供了两种过滤器,一种是GatewayFilter、GlobalFilter;

GatewayFilter:Gateway网关过滤器,是针对单个路由的过滤器,又称局部过滤器,其功能是针对访问的URL起到一定的过滤效果。

GlobalFilter:从名称而言,那就是全局过滤器,是需要实现具体的Java类来实现GlobalFilter接口,这其中可以根据进行权限的验证,HTTP请求的头部添加等等。

Gateway新增一个全局网关过滤器

public class AuthFilter implements GlobalFilter, Ordered {

   private final AuthProperties authProperties;
   private final ObjectMapper objectMapper;
   private final AntPathMatcher antPathMatcher = new AntPathMatcher();

   @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      String path = exchange.getRequest().getURI().getPath();
      ServerHttpResponse resp = exchange.getResponse();
      String headerToken = exchange.getRequest().getHeaders().getFirst(AuthProvider.AUTH_KEY);
      String paramToken = exchange.getRequest().getQueryParams().getFirst("key");
      if (StringUtils.isBlank(headerToken) && StringUtils.isBlank(paramToken)) {
         return unAuth(resp, "缺失令牌,鉴权失败");
      }
      String auth = StringUtils.isBlank(headerToken) ? paramToken : headerToken;
      String token = JwtUtil.getToken(auth);
      Claims claims = JwtUtil.parseJWT(token);
      if (claims == null) {
         return unAuth(resp, "请求未授权");
      }
      return chain.filter(exchange);
   }

   @Override
   public int getOrder() {
      return -100;
   }

}
复制代码

上述代码中就是实现了一个全局权限验证的过滤器,将其放置在Gateway中来实现,就是要对所有的URL来进行验证,其中使用了JwtUtil来解析token,这个我们后面会说一下如何集成JWT的,请大家稍安勿躁。

并且实现了Ordered接口,使用此接口来限定在多个过滤器场景下的过滤器执行次序的问题。

总结

今天学习了Gateway组件中如何自定义网关过滤器的知识,你是否有所收获呢?

おすすめ

転載: juejin.im/post/7034164315586297893