Spring Framework/Spring Cloud

Spring Cloud Gateway Load & Initialize GlobalFilter on runtime

소농배 2020. 11. 29. 13:44

Meta Data 에 GlobalFilter 에 대한 정의도 포함되어 있다. 따라서 GlobalFilter 도 런타임에 Load 하고 bean 으로 등록해야 한다.

 

GLOBAL_CONFIG.json

{
  "filters" : [{
		"filterName" : "HostSettingFilter",
		"args" : {
	  		"host" : "my-host.comm"
		}
  	},
	{
	  "filterName" : "GlobalLoggingFilter",
	  "args" : {}
	},
	{
	  "filterName" : "UnsupportedBrowserFilter",
	  "args" : {
		"unsupportedBrowserRegx" : ".*(MSIE [1-7]\\.).*"
	  }
	}]
}

 

각 GlobalFilter 에 대한 코드는 이미 작성 되어있어야 한다.

작성되어 있는 필터들중 어떤 것을 실제 GlobalFilter 로 사용할지는 Meta Data 를 보고 결정한다.

 

HostSettingFIlter.java

@Slf4j
@ProxyGlobalFilterAnnotation(name = "HostSettingFilter")
public class HostSettingFilter extends ProxyGlobalFilter implements Ordered {

	private final String PROXY_URL;
	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

		ServerHttpRequest request = exchange.getRequest().mutate()
			.headers(httpHeaders -> {
				httpHeaders.remove("Host");
				httpHeaders.add("Host", PROXY_URL);
			}).build();

		// Make sure the header we just set is preserved
		exchange.getAttributes().put(PRESERVE_HOST_HEADER_ATTRIBUTE, true);

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

	@Override
	public int getOrder() {
		return 	Ordered.HIGHEST_PRECEDENCE;
	}
}

 

위와 같이 필터에 대한 정의를 해놓고 Bean 으로 등록하지 않는다.

 

Writing......