(四)Gateway開發教程之自定義閘道器過濾器

語言: CN / TW / HK

theme: vue-pro

這是我參與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 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元件中如何自定義閘道器過濾器的知識,你是否有所收穫呢?