開發人員指南

這些是編寫閘道器一些自定義元件的基本指南。

編寫自定義路由斷言工廠

為了編寫路由斷言,你需要將 RoutePredicateFactory 實現為一個 bean。你可以擴充套件一個名為 AbstractRoutePredicateFactory 的抽象類。

MyRoutePredicateFactory.java
@Component
public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<MyRoutePredicateFactory.Config> {

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

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        // grab configuration from Config object
        return exchange -> {
            //grab the request
            ServerHttpRequest request = exchange.getRequest();
            //take information from the request to see if it
            //matches configuration.
            return matches(config, request);
        };
    }

    public static class Config {
        //Put the configuration properties for your filter here
    }

}

編寫自定義閘道器過濾器工廠

要編寫 GatewayFilter,你必須將 GatewayFilterFactory 實現為一個 bean。你可以擴充套件一個名為 AbstractGatewayFilterFactory 的抽象類。以下示例展示瞭如何做到這一點:

示例 1. PreGatewayFilterFactory.java
@Component
public class PreGatewayFilterFactory extends AbstractGatewayFilterFactory<PreGatewayFilterFactory.Config> {

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

	@Override
	public GatewayFilter apply(Config config) {
		// grab configuration from Config object
		return (exchange, chain) -> {
			//If you want to build a "pre" filter you need to manipulate the
			//request before calling chain.filter
			ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
			//use builder to manipulate the request
			return chain.filter(exchange.mutate().request(builder.build()).build());
		};
	}

	public static class Config {
		//Put the configuration properties for your filter here
	}

}
PostGatewayFilterFactory.java
@Component
public class PostGatewayFilterFactory extends AbstractGatewayFilterFactory<PostGatewayFilterFactory.Config> {

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

	@Override
	public GatewayFilter apply(Config config) {
		// grab configuration from Config object
		return (exchange, chain) -> {
			return chain.filter(exchange).then(Mono.fromRunnable(() -> {
				ServerHttpResponse response = exchange.getResponse();
				//Manipulate the response in some way
			}));
		};
	}

	public static class Config {
		//Put the configuration properties for your filter here
	}

}

配置中自定義過濾器的命名和引用

自定義過濾器的類名應以 GatewayFilterFactory 結尾。

例如,要在配置檔案中引用名為 Something 的過濾器,該過濾器必須在一個名為 SomethingGatewayFilterFactory 的類中。

也可以建立不帶 GatewayFilterFactory 字尾的閘道器過濾器,例如 class AnotherThing。此過濾器可以在配置檔案中被引用為 AnotherThing。這不是一種受支援的命名約定,此語法可能會在未來的版本中刪除。請更新過濾器名稱以符合規定。

編寫自定義全域性過濾器

要編寫自定義全域性過濾器,你必須將 GlobalFilter 介面實現為一個 bean。這會將過濾器應用於所有請求。

以下示例分別展示瞭如何設定全域性前置和後置過濾器:

@Bean
public GlobalFilter customGlobalFilter() {
    return (exchange, chain) -> exchange.getPrincipal()
        .map(Principal::getName)
        .defaultIfEmpty("Default User")
        .map(userName -> {
          //adds header to proxied request
          ServerHttpRequest.Builder builder = exchange.getRequest().mutate().header("CUSTOM-REQUEST-HEADER", userName);
          //use builder to manipulate the request
          return exchange.mutate().request(builder.build()).build();
        })
        .flatMap(chain::filter);
}

@Bean
public GlobalFilter customGlobalPostFilter() {
    return (exchange, chain) -> chain.filter(exchange)
        .then(Mono.just(exchange))
        .map(serverWebExchange -> {
          //adds header to response
          serverWebExchange.getResponse().getHeaders().set("CUSTOM-RESPONSE-HEADER",
              HttpStatus.OK.equals(serverWebExchange.getResponse().getStatusCode()) ? "It worked": "It did not work");
          return serverWebExchange;
        })
        .then();
}
© . This site is unofficial and not affiliated with VMware.