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......