前情回顾
上篇文章,我们讲到了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组件中如何自定义网关过滤器的知识,你是否有所收获呢?