RequestIdGlobalFilter.java
package com.ecommerce.gateway.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.UUID;
import java.util.regex.Pattern;
@Component
public class RequestIdGlobalFilter implements GlobalFilter, Ordered {
public static final String REQUEST_ID_HEADER = "X-Request-Id";
private static final Pattern VALID_REQUEST_ID = Pattern.compile("[A-Za-z0-9_-]{8,64}");
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String requestId = resolveRequestId(exchange.getRequest().getHeaders().getFirst(REQUEST_ID_HEADER));
ServerHttpRequest request = exchange.getRequest().mutate()
.headers(headers -> headers.set(REQUEST_ID_HEADER, requestId))
.build();
exchange.getResponse().getHeaders().set(REQUEST_ID_HEADER, requestId);
return chain.filter(exchange.mutate().request(request).build());
}
@Override
public int getOrder() {
return HIGHEST_PRECEDENCE;
}
public static String resolveRequestId(String candidate) {
if (candidate != null && VALID_REQUEST_ID.matcher(candidate).matches()) {
return candidate;
}
return UUID.randomUUID().toString().replace("-", "");
}
}