gataway斷言工作流程源碼剖析
Cookie斷言
拿Cookie
斷言來(lái)說(shuō),首先看它的體系結(jié)構(gòu)
public class CookieRoutePredicateFactory extends AbstractRoutePredicateFactory<CookieRoutePredicateFactory.Config> { /** * Name key. */ public static final String NAME_KEY = "name"; /** * Regexp key. */ public static final String REGEXP_KEY = "regexp"; public CookieRoutePredicateFactory() { super(Config.class); } /* 通過(guò)shortcutFieldOrder方法設(shè)置Config配置類中的屬性,需要根據(jù)具體的規(guī)則來(lái)設(shè)置 通過(guò)shortcutType方法獲取具體規(guī)則,具體參看:org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType 規(guī)則包括以下幾種: DEFAULT : 按照shortcutFieldOrder順序依次賦值 */ @Override public List<String> shortcutFieldOrder() { return Arrays.asList(NAME_KEY, REGEXP_KEY); } @Override public Predicate<ServerWebExchange> apply(Config config) { return new GatewayPredicate() { @Override public boolean test(ServerWebExchange exchange) { List<HttpCookie> cookies = exchange.getRequest().getCookies() .get(config.name); if (cookies == null) { return false; } for (HttpCookie cookie : cookies) { if (cookie.getValue().matches(config.regexp)) { return true; } } return false; } @Override public String toString() { return String.format("Cookie: name=%s regexp=%s", config.name, config.regexp); } }; } /* 內(nèi)部配置類是用來(lái)接收在配置文件中配置的參數(shù)的 routes: #唯一標(biāo)識(shí)符 - id: hailtaxi-driver uri: lb://hailtaxi-driver #路由斷言 predicates: - Cookie=username,itheima */ @Validated public static class Config { @NotEmpty private String name; @NotEmpty private String regexp; public String getName() { return name; } public Config setName(String name) { this.name = name; return this; } public String getRegexp() { return regexp; } public Config setRegexp(String regexp) { this.regexp = regexp; return this; } } }
盡管Spring Cloud Gateway已經(jīng)包含了很多路由匹配規(guī)則,有時(shí)候我們需要開(kāi)發(fā)自定義路由匹配規(guī)則來(lái)滿足需求,下面簡(jiǎn)單的介紹一下如何自定義路由匹配規(guī)則。
案例
需求:轉(zhuǎn)發(fā)帶token的請(qǐng)求到hailtaxi-drvier
服務(wù)中,這里定義請(qǐng)求帶token是指包含某個(gè)請(qǐng)求頭的請(qǐng)求,至于是什么請(qǐng)求頭可以由配置指定
1、修改配置文件
gateway: #路由配置 routes: #唯一標(biāo)識(shí)符 - id: hailtaxi-driver uri: lb://hailtaxi-driver #路由斷言 predicates: # 自定義一個(gè)Token斷言,如果請(qǐng)求包含Authorization的token信息則通過(guò) - Token=Authorization
2、創(chuàng)建 RoutePredicateFactory
斷言工廠默認(rèn)命名規(guī)則必須按照"名稱"+RoutePredicateFactory,如上TokenRoutePredicateFactory的斷言名稱為Token
@Slf4j @Component // 要交給spring容器管理 public class TokenRoutePredicateFactory extends AbstractRoutePredicateFactory<TokenRoutePredicateFactory.Config> { public TokenRoutePredicateFactory() { super(Config.class); } public Predicate<ServerWebExchange> apply(Config config) { return exchange -> { // 打印配置文件參數(shù)值 String headerName = config.getHeaderName(); HttpHeaders headers = exchange.getRequest().getHeaders(); List<String> header = headers.get(headerName); log.info("Token Predicate headers:{}", header); // 斷言返回的是boolean值 return header!=null && header.size()>0; }; } @Override public List<String> shortcutFieldOrder() { return Arrays.asList("headerName");//指定配置文件中加載到的配置信息應(yīng)填充到Config的哪個(gè)屬性上 } @Override public ShortcutType shortcutType() { return ShortcutType.DEFAULT; } @Data public static class Config { //static class private String headerName;//存儲(chǔ)從配置文件中加載的配置 } }
啟動(dòng)測(cè)試:http://localhost:8001/driver/info/1
以上就是gataway斷言源碼剖析的詳細(xì)內(nèi)容,更多關(guān)于gataway斷言的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中HashMap和Hashtable及HashSet的區(qū)別
以下是對(duì)Java中HashMap和Hashtable及HashSet的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號(hào)
利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號(hào)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10java利用mybatis攔截器統(tǒng)計(jì)sql執(zhí)行時(shí)間示例
這篇文章主要介紹了java利用mybatis攔截器統(tǒng)計(jì)sql執(zhí)行時(shí)間示例,該攔截器攔截mybatis的query和update操作,能統(tǒng)計(jì)sql執(zhí)行時(shí)間2014-03-03jxls2.4.5如何動(dòng)態(tài)導(dǎo)出excel表頭與數(shù)據(jù)
這篇文章主要介紹了jxls2.4.5如何動(dòng)態(tài)導(dǎo)出excel表頭與數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08SpringSecurity+JWT實(shí)現(xiàn)登錄流程分析
Spring Security 是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問(wèn)控制框架,它是為Java應(yīng)用程序設(shè)計(jì)的,特別是那些基于Spring的應(yīng)用程序,下面給大家介紹SpringSecurity+JWT實(shí)現(xiàn)登錄流程,感興趣的朋友一起看看吧2024-12-12Java date format時(shí)間格式化操作示例
這篇文章主要介紹了Java date format時(shí)間格式化操作,結(jié)合具體實(shí)例形式分析了java針對(duì)日期時(shí)間進(jìn)行格式化操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03Java的LinkedHashMap的實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Java的LinkedHashMap的實(shí)現(xiàn)原理詳解,???LinkedHashMap是Map接口的哈希表和鏈接列表實(shí)現(xiàn),具有可預(yù)知的迭代順序,此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵,此類不保證映射的順序,特別是它不保證該順序恒久不變,需要的朋友可以參考下2023-09-09Java設(shè)計(jì)模式之簡(jiǎn)單工廠 工廠方法 抽象工廠深度總結(jié)
設(shè)計(jì)模式(Design Pattern)是前輩們對(duì)代碼開(kāi)發(fā)經(jīng)驗(yàn)的總結(jié),是解決特定問(wèn)題的一系列套路。它不是語(yǔ)法規(guī)定,而是一套用來(lái)提高代碼可復(fù)用性、可維護(hù)性、可讀性、穩(wěn)健性以及安全性的解決方案2021-09-09