[BAEL-3313] spring-cloud/spring-cloud-gateway | Writing custom Spring Cloud Gateway Filters -- address comments (#8251)
* Addressed comments: * Removed Global filter bean with @Order annotation, now using class that implements Ordered * Added logic to actually mutate the request entity (and the exchange) for the Modify Request example * changed endpoint for languageServiceEndpoint in the chain requests example * removed order from first simple global filter, since well be covering that with other global filter
This commit is contained in:
+8
-9
@@ -28,14 +28,14 @@ public class ChainRequestGatewayFilterFactory extends AbstractGatewayFilterFacto
|
||||
|
||||
@Override
|
||||
public List<String> shortcutFieldOrder() {
|
||||
return Arrays.asList("endpoint", "defaultLanguage");
|
||||
return Arrays.asList("languageServiceEndpoint", "defaultLanguage");
|
||||
}
|
||||
|
||||
@Override
|
||||
public GatewayFilter apply(Config config) {
|
||||
return (exchange, chain) -> {
|
||||
return client.get()
|
||||
.uri(config.getEndpoint())
|
||||
.uri(config.getLanguageServiceEndpoint())
|
||||
.exchange()
|
||||
.flatMap(response -> {
|
||||
return (response.statusCode()
|
||||
@@ -45,8 +45,7 @@ public class ChainRequestGatewayFilterFactory extends AbstractGatewayFilterFacto
|
||||
.map(range -> {
|
||||
exchange.getRequest()
|
||||
.mutate()
|
||||
.headers(h -> h.setAcceptLanguage(range))
|
||||
.build();
|
||||
.headers(h -> h.setAcceptLanguage(range));
|
||||
|
||||
String allOutgoingRequestLanguages = exchange.getRequest()
|
||||
.getHeaders()
|
||||
@@ -65,18 +64,18 @@ public class ChainRequestGatewayFilterFactory extends AbstractGatewayFilterFacto
|
||||
}
|
||||
|
||||
public static class Config {
|
||||
private String endpoint;
|
||||
private String languageServiceEndpoint;
|
||||
private String defaultLanguage;
|
||||
|
||||
public Config() {
|
||||
}
|
||||
|
||||
public String getEndpoint() {
|
||||
return endpoint;
|
||||
public String getLanguageServiceEndpoint() {
|
||||
return languageServiceEndpoint;
|
||||
}
|
||||
|
||||
public void setEndpoint(String endpoint) {
|
||||
this.endpoint = endpoint;
|
||||
public void setLanguageServiceEndpoint(String languageServiceEndpoint) {
|
||||
this.languageServiceEndpoint = languageServiceEndpoint;
|
||||
}
|
||||
|
||||
public String getDefaultLanguage() {
|
||||
|
||||
+1
-1
@@ -40,7 +40,7 @@ public class LoggingGatewayFilterFactory extends AbstractGatewayFilterFactory<Lo
|
||||
if (config.isPostLogger())
|
||||
logger.info("Post GatewayFilter logging: " + config.getBaseMessage());
|
||||
}));
|
||||
}, -2);
|
||||
}, 1);
|
||||
}
|
||||
|
||||
public static class Config {
|
||||
|
||||
+18
-4
@@ -12,6 +12,9 @@ import org.slf4j.LoggerFactory;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilter;
|
||||
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
|
||||
@Component
|
||||
public class ModifyRequestGatewayFilterFactory extends AbstractGatewayFilterFactory<ModifyRequestGatewayFilterFactory.Config> {
|
||||
@@ -45,8 +48,7 @@ public class ModifyRequestGatewayFilterFactory extends AbstractGatewayFilterFact
|
||||
|
||||
exchange.getRequest()
|
||||
.mutate()
|
||||
.headers(h -> h.setAcceptLanguageAsLocales(Collections.singletonList(requestLocale)))
|
||||
.build();
|
||||
.headers(h -> h.setAcceptLanguageAsLocales(Collections.singletonList(requestLocale)));
|
||||
}
|
||||
|
||||
String allOutgoingRequestLanguages = exchange.getRequest()
|
||||
@@ -56,8 +58,20 @@ public class ModifyRequestGatewayFilterFactory extends AbstractGatewayFilterFact
|
||||
.map(range -> range.getRange())
|
||||
.collect(Collectors.joining(","));
|
||||
|
||||
logger.info("Modify Request output - Request contains Accept-Language header: " + allOutgoingRequestLanguages);
|
||||
return chain.filter(exchange);
|
||||
logger.info("Modify request output - Request contains Accept-Language header: {}", allOutgoingRequestLanguages);
|
||||
|
||||
ServerWebExchange modifiedExchange = exchange.mutate()
|
||||
.request(originalRequest -> originalRequest.uri(UriComponentsBuilder.fromUri(exchange.getRequest()
|
||||
.getURI())
|
||||
.replaceQueryParams(new LinkedMultiValueMap<String, String>())
|
||||
.build()
|
||||
.toUri()))
|
||||
.build();
|
||||
|
||||
logger.info("Removed all query params: {}", modifiedExchange.getRequest()
|
||||
.getURI());
|
||||
|
||||
return chain.filter(modifiedExchange);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package com.baeldung.springcloudgateway.customfilters.filters.global;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
||||
import org.springframework.cloud.gateway.filter.GlobalFilter;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Component
|
||||
public class FirstPreLastPostGlobalFilter implements GlobalFilter, Ordered {
|
||||
|
||||
final Logger logger = LoggerFactory.getLogger(FirstPreLastPostGlobalFilter.class);
|
||||
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
||||
logger.info("First Pre Global Filter");
|
||||
return chain.filter(exchange)
|
||||
.then(Mono.fromRunnable(() -> {
|
||||
logger.info("Last Post Global Filter");
|
||||
}));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
-14
@@ -5,7 +5,6 @@ import org.slf4j.LoggerFactory;
|
||||
import org.springframework.cloud.gateway.filter.GlobalFilter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.annotation.Order;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@@ -23,17 +22,4 @@ public class LoggingGlobalFiltersConfigurations {
|
||||
}));
|
||||
};
|
||||
}
|
||||
|
||||
@Bean
|
||||
@Order(-1)
|
||||
public GlobalFilter FirstPreLastPostGlobalFilter() {
|
||||
return (exchange, chain) -> {
|
||||
logger.info("First Pre Global Filter");
|
||||
return chain.filter(exchange)
|
||||
.then(Mono.fromRunnable(() -> {
|
||||
logger.info("Last Post Global Filter");
|
||||
}));
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-7
@@ -4,14 +4,13 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
||||
import org.springframework.cloud.gateway.filter.GlobalFilter;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Component
|
||||
public class LoggingGlobalPreFilter implements GlobalFilter, Ordered {
|
||||
public class LoggingGlobalPreFilter implements GlobalFilter {
|
||||
|
||||
final Logger logger = LoggerFactory.getLogger(LoggingGlobalPreFilter.class);
|
||||
|
||||
@@ -20,9 +19,4 @@ public class LoggingGlobalPreFilter implements GlobalFilter, Ordered {
|
||||
logger.info("Global Pre Filter executed");
|
||||
return chain.filter(exchange);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user