diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilter.java index 156225cc..89b8c238 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilter.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/ForwardRoutingFilter.java @@ -19,10 +19,20 @@ public class ForwardRoutingFilter implements GlobalFilter, Ordered { private static final Log log = LogFactory.getLog(ForwardRoutingFilter.class); - private final ObjectProvider dispatcherHandler; + private final ObjectProvider dispatcherHandlerProvider; + //do not use this dispatcherHandler directly, use getDispatcherHandler() instead. + private volatile DispatcherHandler dispatcherHandler; - public ForwardRoutingFilter(ObjectProvider dispatcherHandler) { - this.dispatcherHandler = dispatcherHandler; + public ForwardRoutingFilter(ObjectProvider dispatcherHandlerProvider) { + this.dispatcherHandlerProvider = dispatcherHandlerProvider; + } + + private DispatcherHandler getDispatcherHandler() { + if (dispatcherHandler == null) { + dispatcherHandler = dispatcherHandlerProvider.getIfAvailable(); + } + + return dispatcherHandler; } @Override @@ -46,6 +56,6 @@ public class ForwardRoutingFilter implements GlobalFilter, Ordered { log.trace("Forwarding to URI: "+requestUrl); } - return this.dispatcherHandler.getIfAvailable().handle(exchange); + return this.getDispatcherHandler().handle(exchange); } } diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java index ce691270..1bb6c99a 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/NettyRoutingFilter.java @@ -61,17 +61,26 @@ import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.s public class NettyRoutingFilter implements GlobalFilter, Ordered { private final HttpClient httpClient; - private final ObjectProvider> headersFilters; + private final ObjectProvider> headersFiltersProvider; private final HttpClientProperties properties; + //do not use this headersFilters directly, use getHeadersFilters() instead. + private volatile List headersFilters; public NettyRoutingFilter(HttpClient httpClient, - ObjectProvider> headersFilters, + ObjectProvider> headersFiltersProvider, HttpClientProperties properties) { this.httpClient = httpClient; - this.headersFilters = headersFilters; + this.headersFiltersProvider = headersFiltersProvider; this.properties = properties; } + public List getHeadersFilters() { + if (headersFilters == null) { + headersFilters = headersFiltersProvider.getIfAvailable(); + } + return headersFilters; + } + @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE; @@ -92,8 +101,7 @@ public class NettyRoutingFilter implements GlobalFilter, Ordered { final HttpMethod method = HttpMethod.valueOf(request.getMethodValue()); final String url = requestUrl.toString(); - HttpHeaders filtered = filterRequest(this.headersFilters.getIfAvailable(), - exchange); + HttpHeaders filtered = filterRequest(getHeadersFilters(), exchange); final DefaultHttpHeaders httpHeaders = new DefaultHttpHeaders(); filtered.forEach(httpHeaders::set); @@ -149,7 +157,7 @@ public class NettyRoutingFilter implements GlobalFilter, Ordered { // make sure headers filters run after setting status so it is available in response HttpHeaders filteredResponseHeaders = HttpHeadersFilter.filter( - this.headersFilters.getIfAvailable(), headers, exchange, Type.RESPONSE); + getHeadersFilters(), headers, exchange, Type.RESPONSE); response.getHeaders().putAll(filteredResponseHeaders); diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java index 95508ccc..fdf8bdf5 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/WebsocketRoutingFilter.java @@ -38,14 +38,16 @@ public class WebsocketRoutingFilter implements GlobalFilter, Ordered { private final WebSocketClient webSocketClient; private final WebSocketService webSocketService; - private final ObjectProvider> headersFilters; + private final ObjectProvider> headersFiltersProvider; + //do not use this headersFilters directly, use getHeadersFilters() instead. + private volatile List headersFilters; public WebsocketRoutingFilter(WebSocketClient webSocketClient, WebSocketService webSocketService, - ObjectProvider> headersFilters) { + ObjectProvider> headersFiltersProvider) { this.webSocketClient = webSocketClient; this.webSocketService = webSocketService; - this.headersFilters = headersFilters; + this.headersFiltersProvider = headersFiltersProvider; } @Override @@ -68,8 +70,7 @@ public class WebsocketRoutingFilter implements GlobalFilter, Ordered { HttpHeaders headers = exchange.getRequest().getHeaders(); - HttpHeaders filtered = filterRequest(getHeadersFilters(), - exchange); + HttpHeaders filtered = filterRequest(getHeadersFilters(), exchange); List protocols = headers.get(SEC_WEBSOCKET_PROTOCOL); if (protocols != null) { @@ -85,20 +86,19 @@ public class WebsocketRoutingFilter implements GlobalFilter, Ordered { } private List getHeadersFilters() { - List filters = this.headersFilters.getIfAvailable(); - if (filters == null) { - filters = new ArrayList<>(); + if (this.headersFilters == null) { + this.headersFilters = this.headersFiltersProvider.getIfAvailable(ArrayList::new); + + headersFilters.add((headers, exchange) -> { + HttpHeaders filtered = new HttpHeaders(); + headers.entrySet().stream() + .filter(entry -> !entry.getKey().toLowerCase().startsWith("sec-websocket")) + .forEach(header -> filtered.addAll(header.getKey(), header.getValue())); + return filtered; + }); } - filters.add((headers, exchange) -> { - HttpHeaders filtered = new HttpHeaders(); - headers.entrySet().stream() - .filter(entry -> !entry.getKey().toLowerCase().startsWith("sec-websocket")) - .forEach(header -> filtered.addAll(header.getKey(), header.getValue())); - return filtered; - }); - - return filters; + return this.headersFilters; } private void changeSchemeIfIsWebSocketUpgrade(ServerWebExchange exchange) { diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/HystrixGatewayFilterFactory.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/HystrixGatewayFilterFactory.java index 90d22906..c54014b3 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/HystrixGatewayFilterFactory.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/HystrixGatewayFilterFactory.java @@ -59,11 +59,21 @@ public class HystrixGatewayFilterFactory extends AbstractGatewayFilterFactory dispatcherHandler; + private final ObjectProvider dispatcherHandlerProvider; + //do not use this dispatcherHandler directly, use getDispatcherHandler() instead. + private volatile DispatcherHandler dispatcherHandler; - public HystrixGatewayFilterFactory(ObjectProvider dispatcherHandler) { + public HystrixGatewayFilterFactory(ObjectProvider dispatcherHandlerProvider) { super(Config.class); - this.dispatcherHandler = dispatcherHandler; + this.dispatcherHandlerProvider = dispatcherHandlerProvider; + } + + private DispatcherHandler getDispatcherHandler() { + if (dispatcherHandler == null) { + dispatcherHandler = dispatcherHandlerProvider.getIfAvailable(); + } + + return dispatcherHandler; } @Override @@ -167,8 +177,7 @@ public class HystrixGatewayFilterFactory extends AbstractGatewayFilterFactory