真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringCloudGateway自帶的全局過(guò)濾器GlobalFilter是怎樣的

Gateway的全局過(guò)濾器GlobalFilter是怎樣的,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、右玉網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作商城網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為右玉等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

全局過(guò)濾器作用于所有的路由,不需要單獨(dú)配置,我們可以用它來(lái)實(shí)現(xiàn)很多統(tǒng)一化處理的業(yè)務(wù)需求,比如權(quán)限認(rèn)證、IP 訪問(wèn)限制等。

接口定義類 org.springframework.cloud.gateway.filter.GlobalFilter,具體代碼如下所示。

public interface GlobalFilter {Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

SpringCloud Gateway 自帶的 GlobalFilter 實(shí)現(xiàn)類有很多,如圖 1 所示。

SpringCloud Gateway自帶的全局過(guò)濾器GlobalFilter是怎樣的

有轉(zhuǎn)發(fā)、路由、負(fù)載等相關(guān)的 GlobalFilter,感興趣的朋友可以去看下源碼自行了解。我們?nèi)绾瓮ㄟ^(guò)定義 GlobalFilter 來(lái)實(shí)現(xiàn)我們的業(yè)務(wù)邏輯?

這里給出一個(gè)官方文檔上的案例,代碼如下所示。

@Configurationpublic class ExampleConfiguration {private Logger log = LoggerFactory.getLogger(ExampleConfiguration.class);@Bean@Order(-1)public GlobalFilter a() {return (exchange, chain) -> {
            log.info("first pre filter");return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("third post filter");
            }));
        };
    }@Bean@Order(0)public GlobalFilter b() {return (exchange, chain) -> {
            log.info("second pre filter");return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("second post filter");
            }));
        };
    }@Bean@Order(1)public GlobalFilter c() {return (exchange, chain) -> {
            log.info("third pre filter");return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                log.info("first post filter");
            }));
        };
    }
}

上面定義了 3 個(gè) GlobalFilter,通過(guò) @Order 來(lái)指定執(zhí)行的順序,數(shù)字越小,優(yōu)先級(jí)越高。下面就是輸出的日志,從日志就可以看出執(zhí)行的順序,如下所示。

2019-8-26 16:08:52.406  INFO 55062 --- [ioEventLoop-4-1] c.c.gateway.config.ExampleConfiguration  : first pre filter2019-8-26 16:08:52.406  INFO 55062 --- [ioEventLoop-4-1] c.c.gateway.config.ExampleConfiguration  : second pre filter2019-8-26 16:08:52.407  INFO 55062 --- [ioEventLoop-4-1] c.c.gateway.config.ExampleConfiguration  : third pre filter2019-8-26 16:08:52.437  INFO 55062 --- [ctor-http-nio-7] c.c.gateway.config.ExampleConfiguration  : first post filter2019-8-26 16:08:52.438  INFO 55062 --- [ctor-http-nio-7] c.c.gateway.config.ExampleConfiguration  : second post filter2019-8-26 16:08:52.438  INFO 55062 --- [ctor-http-nio-7] c.c.gateway.config.ExampleConfiguration  : third post filter

當(dāng) GlobalFilter 的邏輯比較多時(shí),筆者還是推薦大家單獨(dú)寫一個(gè) GlobalFilter 來(lái)處理,比如我們要實(shí)現(xiàn)對(duì) IP 的訪問(wèn)限制,即不在 IP 白名單中就不能調(diào)用的需求。

單獨(dú)定義只需要實(shí)現(xiàn) GlobalFilter、Ordered 兩個(gè)接口就可以了,具體代碼如下所示。

@Componentpublic class IPCheckFilter implements GlobalFilter, Ordered {@Overridepublic int getOrder() {return 0;
    }@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        HttpHeaders headers = exchange.getRequest().getHeaders();// 此處寫得非常絕對(duì), 只作演示用, 實(shí)際中需要采取配置的方式if (getIp(headers).equals("127.0.0.1")) {
            ServerHttpResponse response = exchange.getResponse();
            ResponseData data = new ResponseData();data.setCode(401);data.setMessage("非法請(qǐng)求");
            byte[] datas = JsonUtils.toJson(data).getBytes(StandardCharsets.UTF_8);
            DataBuffer buffer = response.bufferFactory().wrap(datas);
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");return response.writeWith(Mono.just(buffer));
        }return chain.filter(exchange);
    }// 這里從請(qǐng)求頭中獲取用戶的實(shí)際IP,根據(jù)Nginx轉(zhuǎn)發(fā)的請(qǐng)求頭獲取private String getIp(HttpHeaders headers) {return "127.0.0.1";
    }
}

過(guò)濾的使用雖然比較簡(jiǎn)單,但作用很大,可以處理很多需求,上面講的 IP 認(rèn)證攔截只是冰山一角,更多的功能需要我們自己基于過(guò)濾器去實(shí)現(xiàn)。

看完上述內(nèi)容,你們掌握Gateway的全局過(guò)濾器GlobalFilter是怎樣的的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


文章標(biāo)題:SpringCloudGateway自帶的全局過(guò)濾器GlobalFilter是怎樣的
文章出自:http://weahome.cn/article/jsedep.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部