首页 > 其他分享 >gateway filter

gateway filter

时间:2024-07-19 13:51:01浏览次数:9  
标签:username exchange gateway filter token user public

默认 filter

默认的有 38 个,分为5组:请求头、请求参数(查询字符串)、响应头、前缀和路径、其他,作用都不是很大,挑几个举个例

# 请求和响应 filter
- id: test_my_consumer
  uri: http://localhost:8082
  predicates:
    - Path=/feign/**
  filters:
    - AddRequestHeader=customer-header1,value1 # 请求头自动添加 customer-header1,值为 value1
    - AddRequestHeader=customer-header2,value2 # 请求头自动添加 customer-header2,值为 value2
    - RemoveRequestHeader=User-Agent # 移除请求头参数 User-Agent
    - SetRequestHeader=Content-Type,application/json;charset=UTF-8 # 修改请求头参数
    - AddRequestParameter=username,milk # url 查询字符串增加参数 username,值为 milk(如果请求url已经有username了,这里就不再添加了)
    - RemoveRequestParameter=userid # url 查询字符串增加参数移除 userid
    - AddResponseHeader=customer-response-header1,response1
    - RemoveResponseHeader=Content-Type
    - SetResponseHeader=Date,2099-01-01
    
    
# 路径前缀 filter(最终还是一致的,页面访问 /user/1 实际访问的是 /feign/user/1,作用是隐藏服务端真实地址)
- id: test_my_consumer2
  uri: http://localhost:8083
  predicates:
    # - Path=/feign/user/** 真实地址 /feign/user/**
    - Path=/user/** # 现在改为 /user/**
  filters:
    - PrefixPath=/fiegn # 加个前缀,页面访问 /user/**,实际访问的是  /feign/user/**

自定义过滤器

不说和 RoutePredicate 一摸一样,至少可以说是大差不差

/**
 * 类名也必须 GatewayFilterFactory 结尾,前面的就是自定义 filter 的名称。这里 My 就是 filter 的名称
 */ 
@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {

    public MyGatewayFilterFactory(){
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(MyGatewayFilterFactory.Config config) {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            //如果 url 包含 username 参数就放行,不然就返回 404
            if (request.getQueryParams().containsKey(config.getProperty())){
                return chain.filter(exchange);
            }else {
                exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
                return exchange.getResponse().setComplete();
            }
        };
    }

    // 启用短促配置,自动映射配置文件的值到 property
    @Override
    public List<String> shortcutFieldOrder() {
        return List.of("property");
    }

    @Getter
    @Setter
    public static class Config
    {
        private String property; // 对应配置文件 property 的参数的值
    }
}

配置文件,结合上面的自定义 filter 代码,全部的含义是:1,/feign/user/** 请求会应用 My 这个过滤器;2,配置文件中的 username 将会映射到过滤器的 property 上;3,过滤器内部获取 url 参数,如果有 username 参数就放行,不然就响应 404

- id: test_my_consumer
  uri: http://localhost:8082
  predicates:
    - Path=/feign/user/** 
  filters:
    - My=username # 短促配置,不用显示指定 property 参数,自动把 username 映射到 property

自定义全局过滤器

注意这是全局过滤器,yaml 不需要配置

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        HttpHeaders headers = exchange.getRequest().getHeaders();
        if (headers.isEmpty()){
            throw new RuntimeException("请求头为空");
        }
        if (!headers.containsKey("access-token")){
            throw new RuntimeException("请求头没有access-token");
        }
        String token = headers.getFirst("access-token");
        if (StringUtils.hasText(token)){
            throw new RuntimeException("请求头access-token为空");
        }
        // 到 redis 验证,token 是否合法
        if (!exist(token)){
            throw new RuntimeException("access-token不合法");
        }
        // 返回过滤器(请求都会应用这个过滤器)
        return chain.filter(exchange);
    }

    /**
     * 数字越小,优先级越高
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

标签:username,exchange,gateway,filter,token,user,public
From: https://www.cnblogs.com/cyrushuang/p/18311347

相关文章

  • 过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别
    https://www.cnblogs.com/kuotian/p/13176186.html过滤器FilterFilter有如下几个用处。Filter有如下几个种类。javax.servlet.Filter接口1.通过@WebFilter注解配置2.通过@Bean来配置3.SpringMVC在web.xml配置过滤器启动测试拦截器InterceptorHandlerIn......
  • search_fields 和 FilterSet
     第一种方法search_fields=['code','name','short_name','org_type','trade_status','address','search']#search字段模糊搜索 第二种方法fromdjango_filters.rest_frameworkimportFi......
  • 微服务组件之Gateway
    一、什么是路由网关(Gateway)?路由网关(Gateway)是微服务架构中的一种关键组件,它在服务之间以及客户端和服务之间起到路由和分发请求的作用。在微服务架构中,服务通常是分布式的,并且可能有很多独立的服务运行在不同的主机和端口上二、Gateway有哪些特性?请求路由:将进入的请求路由到......
  • Cilium Gateway API 特性(转载)
    CiliumGatewayAPI特性(转载)一、环境信息主机IPubuntu10.0.0.234软件版本docker26.1.4helmv3.15.0-rc.2kind0.18.0kubernetes1.23.4ubuntuosUbuntu22.04.6LTSkernel5.15.0-106二、CiliumGatewayAPI流程图Cilium现在......
  • gateway 使用细节
    spring:cloud:gateway:routes:-id:test_my_provider#自定义,全局唯一即可uri:http://localhost:8081#实际调用的地址predicates:-Path=/test/**#请求匹配规则-id:test_my_consumeruri......
  • Java中的Filter流:理解与应用
    Java中的Filter流:理解与应用1、字节Filter流1.1FilterInputStream1.2FilterOutputStream2、字符Filter流2.1FilterReader2.2FilterWriter3、使用Filter流的好处......
  • uniform_filter1d之nearest模式基于JAVA编程实现
    1privatestaticDouble[]uniform_filter1d_double_fast(Double[]input,intsize){2Double[]output=newDouble[input.length];3//https://github.com/scipy/scipy4//‘nearest’(aaaa|abcd|dddd)5bool......
  • js 数组方法 - 查找 - indexOf()、includes()、find()、findIndex()、filter()、lastI
    indexOf()该方法可以返回数组中指定元素的索引,如果不存在,则返回-1。constarr=["apple","banana","orange"];constindex=arr.indexOf("banana");console.log(index);//输出:1constarr2=["aaa","bbb","ccc",9......
  • 卡尔曼滤波Kalman Filter零基础入门到实践(上部)
    参考视频:入门(秒懂滤波概要)_哔哩哔哩_bilibili一、入门1.引入假设超声波距离传感器每1ms给单片机发数据。理论数据为黑点,测量数据曲线为红线,引入滤波后的数据为紫线引入滤波的作用是过滤数据中的噪声,使信号更趋于真实值。2.卡尔曼滤波适用系统卡尔曼滤波适用于线性高斯......
  • JavaScript 进阶(五)---forEach/map/filterevery/some/includes/reduce的详细用法
    目录1.forEach2.map3.filter4.for...in5.for...of6.every7.some8.includes9.reduce举个例子:使用fliter:使用 map 来筛选并转换数组使用 forEach 来筛选并构建数组总结1.forEach-详解:`forEach`方法对数组的每个元素执行一次提供的函数。这个方......