web-dev-qa-db-fra.com

Comment spécifier un filtre personnalisé dans application.yml Spring Cloud Gateway

J'ai un filtre de passerelle personnalisé fichier MYGatewayFilter.Java maintenant je veux utiliser ce filtre de passerelle avec mon itinéraire écrit dans application.yml

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

Comment définir des filtres pour l'itinéraire ci-dessus

Filtre personnalisé 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());
  }
}       
10
GOURAV MEHTA

Au lieu d'implémenter GatewayFilter, vous devez implémenter GatewayFilterFactory

et en faire un composant:

@Component
public class MyGatewayFilter implements GatewayFilterFactory {

Ensuite, vous pouvez vous y référer par le nom du bean dans votre itinéraire.

filters:
- MyGatewayFilter

La documentation à ce sujet n'est pas très bonne pour le moment. Je n'ai pu comprendre cela qu'en regardant le code source de Spring-Cloud-Gateway sur Github

14
devo

Vous devez implémenter 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;
        }
    }
}

et dans le fichier application.yml

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

Je pense qu'il y a des changements dans Spring Cloud Gateway 2.2.1.
J'ai fait référence à 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);
           }
       }
*/
    }

}

et dans le fichier application.yml

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