gataway断言工作流程源码剖析

 更新时间:2024年01月15日 08:31:37   作者:朱永胜  
这篇文章主要为大家介绍了gataway断言工作流程源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Cookie断言

Cookie断言来说,首先看它的体系结构

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);
    }
    /*
      通过shortcutFieldOrder方法设置Config配置类中的属性,需要根据具体的规则来设置
      通过shortcutType方法获取具体规则,具体参看:org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType
      规则包括以下几种:
        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);
            }
        };
    }
    /*
     内部配置类是用来接收在配置文件中配置的参数的
      routes:
        #唯一标识符
        - 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已经包含了很多路由匹配规则,有时候我们需要开发自定义路由匹配规则来满足需求,下面简单的介绍一下如何自定义路由匹配规则。

案例

需求:转发带token的请求到hailtaxi-drvier服务中,这里定义请求带token是指包含某个请求头的请求,至于是什么请求头可以由配置指定

1、修改配置文件

gateway:
      #路由配置
      routes:
        #唯一标识符
        - id: hailtaxi-driver
          uri: lb://hailtaxi-driver
          #路由断言
          predicates:
            # 自定义一个Token断言,如果请求包含Authorization的token信息则通过
            - Token=Authorization

2、创建 RoutePredicateFactory

断言工厂默认命名规则必须按照"名称"+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 -> {
            // 打印配置文件参数值
            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");//指定配置文件中加载到的配置信息应填充到Config的哪个属性上
    }
    @Override
    public ShortcutType shortcutType() {
        return ShortcutType.DEFAULT;
    }
    @Data
    public static class Config { //static class
        private String headerName;//存储从配置文件中加载的配置
    }
}

启动测试:http://localhost:8001/driver/info/1

以上就是gataway断言源码剖析的详细内容,更多关于gataway断言的资料请关注脚本之家其它相关文章!

相关文章

  • Java中HashMap和Hashtable及HashSet的区别

    Java中HashMap和Hashtable及HashSet的区别

    以下是对Java中HashMap和Hashtable及HashSet的区别进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • 浅谈Java的LinkedHashSet源码

    浅谈Java的LinkedHashSet源码

    这篇文章主要介绍了浅谈Java的LinkedHashSet源码,底层是链表实现的,是set集合中唯一一个能保证怎么存就怎么取的集合对象
    因为是HashSet的子类,所以也是保证元素唯一的,与HashSet的原理一样,需要的朋友可以参考下
    2023-09-09
  • 利用Java正则表达式校验邮箱与手机号

    利用Java正则表达式校验邮箱与手机号

    利用Java正则表达式校验邮箱与手机号。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • 详解Java编程中JavaMail API的使用

    详解Java编程中JavaMail API的使用

    这篇文章主要介绍了详解Java编程中JavaMail API的使用,通过JavaMail可以实现丰富的邮件类相关功能,需要的朋友可以参考下
    2015-11-11
  • java利用mybatis拦截器统计sql执行时间示例

    java利用mybatis拦截器统计sql执行时间示例

    这篇文章主要介绍了java利用mybatis拦截器统计sql执行时间示例,该拦截器拦截mybatis的query和update操作,能统计sql执行时间
    2014-03-03
  • jxls2.4.5如何动态导出excel表头与数据

    jxls2.4.5如何动态导出excel表头与数据

    这篇文章主要介绍了jxls2.4.5如何动态导出excel表头与数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringSecurity+JWT实现登录流程分析

    SpringSecurity+JWT实现登录流程分析

    Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是为Java应用程序设计的,特别是那些基于Spring的应用程序,下面给大家介绍SpringSecurity+JWT实现登录流程,感兴趣的朋友一起看看吧
    2024-12-12
  • Java date format时间格式化操作示例

    Java date format时间格式化操作示例

    这篇文章主要介绍了Java date format时间格式化操作,结合具体实例形式分析了java针对日期时间进行格式化操作的相关实现技巧,需要的朋友可以参考下
    2017-03-03
  • Java的LinkedHashMap的实现原理详解

    Java的LinkedHashMap的实现原理详解

    这篇文章主要介绍了Java的LinkedHashMap的实现原理详解,   LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序,此实现提供所有可选的映射操作,并允许使用null值和null键,此类不保证映射的顺序,特别是它不保证该顺序恒久不变,需要的朋友可以参考下
    2023-09-09
  • Java设计模式之简单工厂 工厂方法 抽象工厂深度总结

    Java设计模式之简单工厂 工厂方法 抽象工厂深度总结

    设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案
    2021-09-09

最新评论