個人對于網關路由的理解:
? ? ? ? 網關就相當于是一個項目里面的保安,主要作用就是做一個限制項。(zuul和gateway兩個不同的網關)
在路由中進行配置過濾器
過濾器工廠:對請求或響應進行加工
其中filters:過濾器配置的時當前配置下生效的,如果我們需要讓他的生效范圍編程全局的只需要把filters變成default-filters:即可
全局過濾器:(自己定義邏輯內容)Global-filters
主要邏輯:首先獲得請求參數,然后讀取請求參數中的authorization參數,判斷參數值是否等于admin,如果是,放行,不是就攔截。其中authorization參數是請求中有的參數,可以換成其他不一樣的參數進行正確性判斷,從而達到設置的效果
具體實現:order值越小,優先級越高,執行順序越靠前
package cn.itcast.gateway.filters;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
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;import java.lang.annotation.Annotation;/*** @author 32338* @date 2024-06-29 16:40:01* @description 定義權限過濾器,用來過濾authorization=admin的放行*/
//@Order(-1) 使用這個參數或者繼承Order接口
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//1,先取到請求參數ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> params = request.getQueryParams();//2,從請求參數里面得到authorizationString auth = params.getFirst("authorization");//3,判斷authorization是否等于adminif ("admin".equals(auth)){//4,是則放行return chain.filter(exchange);}//5,否,則攔截//設置狀態碼exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); //UNAUTHORIZED未授權//返回return exchange.getResponse().setComplete();}@Overridepublic int getOrder() {return -1;//實現Order來提高過濾器的過濾級別}
}
?過濾器鏈執行排序
? ? ? ? 默認過濾器>路由過濾器>全局過濾器
對于全局路由器的理解:
在全局路由器中我們實現了GlobalFilter接口,但在GlobalFilter接口中所有的GlobalFilter都可以被適配成GatewayFilter。
關于適配器中的Ordered排序問題:在配置文件中的過濾器是屬于Spring自動配置前后順序,默認從1開始。不過在我們設置了過濾器的順序之后可能會出現過濾器排序Order值相等的情況,那么我們就會先從default-filter開始然后再執行路由過濾器最后執行全局過濾器。
網關的跨域問題:
????????域名不一樣就叫做跨域(包括小小的不同)
跨域問題:瀏覽器禁止發起者與服務端發生跨域ajax請求,請求被攔截問題
解決方式:CORS
我們只需要在配置文件中加入以下配置,可酌情修改一些不需要的
spring:cloud:gateway:# 。。。globalcors: # 全局的跨域處理add-to-simple-url-handler-mapping: true # 解決options請求被攔截問題corsConfigurations:'[/**]':allowedOrigins: # 允許哪些網站的跨域請求 - "http://localhost:8090"allowedMethods: # 允許的跨域ajax的請求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允許在請求中攜帶的頭信息allowCredentials: true # 是否允許攜帶cookiemaxAge: 360000 # 這次跨域檢測的有效期
add-to-simple-url-handler-mapping: true # 解決options請求被攔截問題:(網關特有)
通俗的話來說就是我們ajax用的是CORS跨域方案,這個方案就是瀏覽器問服務器,你讓不讓那哥們跨域,請求方式是option默認會被網關攔截,設置true就不會被攔截。
減少CORS跨域解決方案對性能的消耗,我們需要設置跨域檢測的有效期