全局過濾器的作用也是處理一切進入網關的請求和微服務響應,與GatewayFilter的作用一樣。
區別在於GatewayFilter通過配置定義,處理邏輯是固定的。而GlobalFilter的邏輯需要自己寫代碼實現。
定義方式是實現GlobalFilter接口。
public interface GlobalFilter { /** * 處理當前請求,有必要的話通過{@link GatewayFilterChain}將請求交給下一個過濾器處理 * * @param exchange 請求上下文,里面可以獲取Request、Response等信息 * @param chain 用來把請求委托給下一個過濾器 * @return {@code Mono<Void>} 返回標示當前過濾器業務結束 */ Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain); }
案例:定義全局過濾器,攔截並判斷用戶身份
需求:定義全局過濾器,攔截請求,判斷請求的參數是否滿足下面條件:
1.參數中是否有authorization,
2.authorization參數值是否為admin
如果同時滿足則放行,否則攔截
自定義類,實現GlobalFilter接口,添加@Order注解:
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.stereotype.Component; import org.springframework.util.MultiValueMap; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; // @Order(-1) //設置全局過濾器執行順序
@Component public class AuthorizeFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 1.獲取請求參數
ServerHttpRequest request = exchange.getRequest(); MultiValueMap<String, String> params = request.getQueryParams(); // 2.獲取參數中的 authorization 參數
String auth = params.getFirst("authorization"); // 3.判斷參數值是否等於 admin
if ("admin".equals(auth)) { // 4.是,放行
return chain.filter(exchange); } // 5.否,攔截 // 5.1.設置狀態碼
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); // 5.2.攔截請求
return exchange.getResponse().setComplete(); } @Override public int getOrder() { return -1; } }
總結
全局過濾器的作用是什么?
對所有路由都生效的過濾器,並且可以自定義處理邏輯
實現全局過濾器的步驟?
1.實現GlobalFilter接口
2.添加@Order注解或實現Ordered接口(注:過濾器一定要有順序)
3.編寫處理邏輯