Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在application.yml Spring云网关中指定自定义筛选器_Java_Spring_Spring Boot_Spring Cloud Netflix_Api Gateway - Fatal编程技术网

Java 如何在application.yml Spring云网关中指定自定义筛选器

Java 如何在application.yml Spring云网关中指定自定义筛选器,java,spring,spring-boot,spring-cloud-netflix,api-gateway,Java,Spring,Spring Boot,Spring Cloud Netflix,Api Gateway,我有一个自定义网关过滤器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文件,现在我想在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());
  }
}       
公共类MyGatewayFilter实现GatewayFilter{
@凌驾
公共Mono筛选器(服务器WebExchange exchange、网关筛选器链){
ServerHttpRequest请求;
if(request.getHeaders().get(“x-mydata”)!=null){
request=exchange.getRequest().mutate().header(“我的新头”,request.getHeaders().get(“x-mydata”).get(0)).build();
}
return chain.filter(exchange.mutate().request(request.build());
}
}       

您应该实施GatewayFilterFactory,而不是实施GatewayFilter

并将其作为一个组件:

@Component
public class MyGatewayFilter implements GatewayFilterFactory {
然后,您可以通过路由中的bean名称来引用它

filters:
- MyGatewayFilter

目前关于这方面的文档不是很好。我只能通过查看github上spring cloud gateway的源代码来了解这一点

您需要实现
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;
        }
    }
}

我认为Spring Cloud Gateway 2.2.1有一些变化。
我提到

@组件
公共类DemoGatewayFilter实现AbstractGatewayFilterFactory{
@凌驾
公共网关筛选器应用(对象配置){
退货(交换、连锁)->{
返回链。过滤器(交换);
};
/*
它也有效
返回新网关筛选器(){
@凌驾
公共Mono筛选器(服务器WebExchange exchange、网关筛选器链){
返回链。过滤器(交换);
}
}
*/
}
}
在application.yml文件中

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

问题是筛选器未被读取或什么。请同时粘贴筛选器代码。@GrinishNepal筛选器代码已附加,问题是如何在application.yml筛选器属性中指定此筛选器为什么为-1?我正在尝试解决同样的问题,没有关于如何向路由添加自定义筛选器的文档。请注意,
PropertiesRouteDefinitionLocator
将删除筛选器名称的最后一部分,如果它等于
RoutePredicateFactory
GatewayFilterFactory
。请参阅:
PropertiesRouteDefinitionLocator
FilterDefinition
NameUtils
。因此,如果您的筛选器位于类
PrincipalNameGatewayFilterFactory
中,则必须使用筛选器名称
PrincipalName
配置路由。