在 Spring Cloud Gateway 中,過濾器總共分為以下兩大類:
Spring Cloud Gateway 中的局部過濾器配置如下:
spring: cloud: gateway: routes: - id: userservice uri: http://192.168.1.7:56628 predicates: - Path=/user/** filters: - AddResponseHeader=gateway-flag, javacn.site
以上過濾器的含義是在輸出對象 Response 中添加 Header 信息,key 為“gateway-flag”,value 為“javacn.site”。
PS:AddResponseHeader 也是 Gateway 內(nèi)置過濾器之一。
全局過濾器會對當(dāng)前網(wǎng)關(guān)中的所有路由都生效。
Spring Cloud Gateway 中的內(nèi)置全局過濾器配置如下:
spring: cloud: gateway: routes: - id: userservice uri: http://192.168.1.7:51627 predicates: - Weight=group1,50 - id: userservice2 uri: http://192.168.1.7:56628 predicates: - Weight=group1,50 filters: - AddResponseHeader=gateway-flag, javacn.site default-filters: - AddResponseHeader=gateway-default-filters, www.javacn.site
其中的“default-filters”就是全局內(nèi)置過濾器,它對所有的路由(route)有效,它的含義是在輸出對象 Response 中添加 Header 信息,key 為“gateway-default-filters”,value 為“www.javacn.site”。
Spring Cloud Gateway 中自定義全局過濾器的實(shí)現(xiàn)是,定義一個類,使用 @Component 注解將其存入 IoC 容器,然后再實(shí)現(xiàn) GlobalFilter 接口,重寫 filter 方法,在 filter 中寫自己的過濾方法即可,具體實(shí)現(xiàn)如下:
import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.http.HttpStatus;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.http.server.reactive.ServerHttpResponse;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;@Componentpublic class AuthFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 得到 request、response 對象 ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); // 業(yè)務(wù)邏輯代碼 if(request.getQueryParams().getFirst("auth")==null){ // 權(quán)限有問題返回,并結(jié)束執(zhí)行 response.setStatusCode(HttpStatus.FORBIDDEN); return response.setComplete(); } // 此步驟正常,執(zhí)行下一步 return chain.filter(exchange); } @Override public int getOrder() { // 此值越小越早執(zhí)行 return 1; }}
以上代碼是驗(yàn)證請求參數(shù)中是否有“auth”參數(shù),如果沒有的話就認(rèn)為未登錄,調(diào)用“response.setComplete()”終止繼續(xù)執(zhí)行,反之則認(rèn)為已經(jīng)登錄,可以執(zhí)行后續(xù)流程了,使用“chain.filter(exchange)”來實(shí)現(xiàn)。
本文鏈接:http://www.www897cc.com/showinfo-26-70404-0.html面試官:SpringCloudGateway過濾器類型有哪些?
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com