diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ChainRequestGatewayFilterFactory.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ChainRequestGatewayFilterFactory.java index f7e754fd70..1f4e2a96cb 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ChainRequestGatewayFilterFactory.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ChainRequestGatewayFilterFactory.java @@ -28,14 +28,14 @@ public class ChainRequestGatewayFilterFactory extends AbstractGatewayFilterFacto @Override public List 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() { diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/LoggingGatewayFilterFactory.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/LoggingGatewayFilterFactory.java index db73ba99c0..18532e34a8 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/LoggingGatewayFilterFactory.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/LoggingGatewayFilterFactory.java @@ -40,7 +40,7 @@ public class LoggingGatewayFilterFactory extends AbstractGatewayFilterFactory { @@ -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()) + .build() + .toUri())) + .build(); + + logger.info("Removed all query params: {}", modifiedExchange.getRequest() + .getURI()); + + return chain.filter(modifiedExchange); }; } diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/FirstPreLastPostGlobalFilter.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/FirstPreLastPostGlobalFilter.java new file mode 100644 index 0000000000..5b58eee8a6 --- /dev/null +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/FirstPreLastPostGlobalFilter.java @@ -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 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; + } +} diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalFiltersConfigurations.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalFiltersConfigurations.java index cf2ff3af16..8edcf2a073 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalFiltersConfigurations.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalFiltersConfigurations.java @@ -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"); - })); - }; - } - } diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalPreFilter.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalPreFilter.java index d91075e4b6..bd29499868 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalPreFilter.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalPreFilter.java @@ -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; - } } diff --git a/spring-cloud/spring-cloud-gateway/src/main/resources/customfilters-global-application.properties b/spring-cloud/spring-cloud-gateway/src/main/resources/customfilters-global-application.properties index 116bc706cb..08421a0653 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/resources/customfilters-global-application.properties +++ b/spring-cloud/spring-cloud-gateway/src/main/resources/customfilters-global-application.properties @@ -9,8 +9,8 @@ spring.cloud.gateway.routes[0].filters[1]=Logging=My Custom Message, true, true #spring.cloud.gateway.routes[0].filters[1].args[preLogger]=true #spring.cloud.gateway.routes[0].filters[1].args[postLogger]=true -spring.cloud.gateway.routes[0].filters[2]=ModifyRequest=en -spring.cloud.gateway.routes[0].filters[3]=ModifyResponse +spring.cloud.gateway.routes[0].filters[2]=ModifyResponse +spring.cloud.gateway.routes[0].filters[3]=ModifyRequest=en spring.cloud.gateway.routes[0].filters[4]=ChainRequest=http://localhost:8082/resource/language, fr management.endpoints.web.exposure.include=* diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersLiveTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersLiveTest.java index 40275bd206..b24db70e4f 100644 --- a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersLiveTest.java +++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersLiveTest.java @@ -45,6 +45,8 @@ public class CustomFiltersLiveTest { response.expectStatus() .isOk() + .expectHeader() + .doesNotExist("Bael-Custom-Language-Header") .expectBody(String.class) .isEqualTo("Service Resource"); @@ -60,7 +62,8 @@ public class CustomFiltersLiveTest { .haveAtLeastOne(eventContains("Pre GatewayFilter logging: My Custom Message")) .haveAtLeastOne(eventContains("Post GatewayFilter logging: My Custom Message")) // Modify Request - .haveAtLeastOne(eventContains("Modify Request output - Request contains Accept-Language header:")) + .haveAtLeastOne(eventContains("Modify request output - Request contains Accept-Language header:")) + .haveAtLeastOne(eventContainsExcept("Removed all query params: ", "locale")) // Modify Response .areNot(eventContains("Added custom header to Response")) // Chain Request @@ -75,16 +78,33 @@ public class CustomFiltersLiveTest { response.expectStatus() .isOk() + .expectHeader() + .exists("Bael-Custom-Language-Header") .expectBody(String.class) .isEqualTo("Service Resource"); assertThat(LoggerListAppender.getEvents()) // Modify Response - .haveAtLeastOne(eventContains("Added custom header to Response")); + .haveAtLeastOne(eventContains("Added custom header to Response")) + .haveAtLeastOne(eventContainsExcept("Removed all query params: ", "locale")); } + /** + * This condition will be successful if the event contains a substring + */ private Condition eventContains(String substring) { return new Condition(entry -> (substring == null || (entry.getFormattedMessage() != null && entry.getFormattedMessage() .contains(substring))), String.format("entry with message '%s'", substring)); } + + /** + * This condition will be successful if the event contains a substring, but not another one + */ + private Condition eventContainsExcept(String substring, String except) { + return new Condition(entry -> (substring == null || (entry.getFormattedMessage() != null && entry.getFormattedMessage() + .contains(substring) + && !entry.getFormattedMessage() + .contains(except))), + String.format("entry with message '%s'", substring)); + } }