这是我参与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组件中如何自定义网关过滤器的知识,你是否有所收获呢?
近期评论