亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

gataway斷言工作流程源碼剖析

 更新時(shí)間:2024年01月15日 08:31:37   作者:朱永勝  
這篇文章主要為大家介紹了gataway斷言工作流程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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ū)別

    Java中HashMap和Hashtable及HashSet的區(qū)別

    以下是對(duì)Java中HashMap和Hashtable及HashSet的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • 淺談Java的LinkedHashSet源碼

    淺談Java的LinkedHashSet源碼

    這篇文章主要介紹了淺談Java的LinkedHashSet源碼,底層是鏈表實(shí)現(xiàn)的,是set集合中唯一一個(gè)能保證怎么存就怎么取的集合對(duì)象
    因?yàn)槭荋ashSet的子類,所以也是保證元素唯一的,與HashSet的原理一樣,需要的朋友可以參考下
    2023-09-09
  • 利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號(hào)

    利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號(hào)

    利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號(hào)。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • 詳解Java編程中JavaMail API的使用

    詳解Java編程中JavaMail API的使用

    這篇文章主要介紹了詳解Java編程中JavaMail API的使用,通過(guò)JavaMail可以實(shí)現(xiàn)豐富的郵件類相關(guān)功能,需要的朋友可以參考下
    2015-11-11
  • java利用mybatis攔截器統(tǒng)計(jì)sql執(zhí)行時(shí)間示例

    java利用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-03
  • jxls2.4.5如何動(dòng)態(tài)導(dǎo)出excel表頭與數(shù)據(jù)

    jxls2.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-08
  • SpringSecurity+JWT實(shí)現(xiàn)登錄流程分析

    SpringSecurity+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-12
  • Java date format時(shí)間格式化操作示例

    Java date format時(shí)間格式化操作示例

    這篇文章主要介紹了Java date format時(shí)間格式化操作,結(jié)合具體實(shí)例形式分析了java針對(duì)日期時(shí)間進(jìn)行格式化操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03
  • Java的LinkedHashMap的實(shí)現(xiàn)原理詳解

    Java的LinkedHashMap的實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Java的LinkedHashMap的實(shí)現(xiàn)原理詳解,???LinkedHashMap是Map接口的哈希表和鏈接列表實(shí)現(xiàn),具有可預(yù)知的迭代順序,此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵,此類不保證映射的順序,特別是它不保證該順序恒久不變,需要的朋友可以參考下
    2023-09-09
  • Java設(shè)計(jì)模式之簡(jiǎn)單工廠 工廠方法 抽象工廠深度總結(jié)

    Java設(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

最新評(píng)論