【问题标题】:How to Specify custom filter in application.yml Spring Cloud Gateway如何在 application.yml Spring Cloud Gateway 中指定自定义过滤器
【发布时间】:2018-06-21 14:56:52
【问题描述】:

我有一个自定义网关过滤器 MYGatewayFilter.java 文件,现在我想将此网关过滤器与我在 application.yml 中编写的路由一起使用

 spring:
  cloud:
   gateway:
    routes:
      - id: login2_route
      uri: http://127.0.0.1:8083/login
      predicates:
       - Path: /login/
      filters:

我如何为上述路线定义过滤器

自定义过滤器 MyGatewayFilter.java

public class MyGatewayFilter implements GatewayFilter {
    @Override
  public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      ServerHttpRequest request;
      if(request.getHeaders().get("x-mydata")!=null){
         request= exchange.getRequest().mutate().header("my-new-header",request.getHeaders().get("x-mydata").get(0)).build();
      }

      return chain.filter(exchange.mutate().request(request).build());
  }
}       

【问题讨论】:

  • 什么问题是过滤器没有被读取或什么。同时粘贴过滤器代码。
  • @GrinishNepal 过滤器代码已附加,问题是如何在 application.yml 过滤器属性中指定此过滤器
  • 为什么是-1?我试图弄清楚同样的事情,没有关于如何将自定义过滤器添加到路由的文档。
  • 你的问题解决了吗,我也遇到了同样的问题,但是尝试了解决方法还是没有成功。@GOURAV MEHTA

标签: java spring spring-boot spring-cloud-netflix api-gateway


【解决方案1】:

你应该实现 GatewayFilterFactory 而不是实现 GatewayFilter

并使其成为组件:

@Component
public class MyGatewayFilter implements GatewayFilterFactory {

然后你可以通过路由中的bean名称来引用它。

filters:
- MyGatewayFilter

目前这方面的文档不是很好。我只能通过查看 github 上 spring-cloud-gateway 的源代码来解决这个问题

【讨论】:

  • 注意PropertiesRouteDefinitionLocator如果等于RoutePredicateFactoryGatewayFilterFactory,则删除过滤器名称的最后部分。请参阅:PropertiesRouteDefinitionLocatorFilterDefinitionNameUtils。因此,如果您的过滤器属于 PrincipalNameGatewayFilterFactory 类,则必须使用过滤器名称 PrincipalName 配置路由。
  • 嗨,你有没有关于这个自定义网关过滤器的最小演示。 @devo
【解决方案2】:

你需要实现GatewayFilterFactory

@Component
public class DemoGatewayFilter implements GatewayFilterFactory<DemoGatewayFilter.Config> {

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            System.out.println("gateway filter name "+config.getName());
            return chain.filter(exchange);
        };
    }

    @Override
    public Config newConfig() {
        return new Config("DemoGatewayFilter");
    }

    public static class Config {

        public Config(String name){
            this.name = name;
        }
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

在 application.yml 文件中

 spring:
  application:
  cloud:
    gateway:
      routes:
      - id: MayApplication
        uri: http://myapplication:8080
        predicates:
        - Path=/apipath/to/filter/**
        filters:
          - DemoGatewayFilter

【讨论】:

  • 我试过你的方法,但是向spring gateway发出请求时id没有进入过滤器。这是我要重现的代码,我不知道我哪里出错了:github.com/jiangxiaoqiang/java-learn@Nitin
【解决方案3】:

我认为 Spring Cloud Gateway 2.2.1 有一些变化。
我提到了SaveSessionGatewayFilterFactory.java

@Component
public class DemoGatewayFilter implements AbstractGatewayFilterFactory {

    @Override
    public GatewayFilter apply(Object config) {
        return (exchange, chain) -> {
            return chain.filter(exchange);
        };
/*
it works too
       return new GatewayFilter() {
           @Override
           public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
               return chain.filter(exchange);
           }
       }
*/
    }

}

在 application.yml 文件中

 spring:
  application:
  cloud:
    gateway:
      routes:
      - id: MayApplication
        uri: http://myapplication:8080
        predicates:
        - Path=/api/path/to/filter/**
        filters:
          - DemoGatewayFilter

【讨论】:

猜你喜欢
  • 2020-11-04
  • 2020-11-14
  • 2020-02-29
  • 2019-04-27
  • 2021-07-31
  • 2018-11-01
  • 2021-02-13
  • 2023-03-04
  • 2020-04-13
相关资源
最近更新 更多