programing

application.yml Spring Cloud Gateway에서 사용자 지정 필터를 지정하는 방법

css3 2023. 8. 13. 09:53

application.yml Spring Cloud Gateway에서 사용자 지정 필터를 지정하는 방법

사용자 지정 게이트웨이 필터 MYGatewayFilter.java 파일이 있습니다. 이제 application.yml에 기록된 경로로 이 게이트웨이 필터를 사용합니다.

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

위 경로에 대한 필터를 어떻게 정의합니까?

사용자 지정 필터 My GatewayFilter.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());
  }
}       

GatewayFilter를 구현하는 대신 GatewayFilterFactory를 구현해야 합니다.

구성요소로 만듭니다.

@Component
public class MyGatewayFilter implements GatewayFilterFactory {

그러면 당신은 당신의 경로에 있는 콩 이름으로 그것을 참조할 수 있습니다.

filters:
- MyGatewayFilter

이것에 대한 문서는 현재 별로 좋지 않습니다.나는 github에서 스프링-클라우드 게이트웨이의 소스 코드를 보고 이것을 알아낼 수 있었습니다.

구현해야 합니다.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 Cloud Gateway 2.2.1에 몇 가지 변경 사항이 있는 것 같습니다.
SaveSessionGatewayFilterFactory.java를 참조했습니다.

@Component
public class DemoGatewayFilter extends 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

언급URL : https://stackoverflow.com/questions/48221295/how-to-specify-custom-filter-in-application-yml-spring-cloud-gateway