In feign you can implement a RequestInterceptor as follows
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import java.util.UUID;
public class TokenClientInterceptor implements RequestInterceptor {
private static final Logger LOG = LoggerFactory.getLogger(TokenClientInterceptor.class);
public static final String TOKEN_HEADER_NAME = "my-token";
@Override
public void apply(RequestTemplate template) {
var traceToken = computeTraceTokenIfAbsent();
template.header(TOKEN_HEADER_NAME, traceToken);
}
private String computeTraceTokenIfAbsent() {
try {
var attribute =
RequestContextHolder.currentRequestAttributes()
.getAttribute(TOKEN_HEADER_NAME, RequestAttributes.SCOPE_REQUEST);
if (attribute instanceof String strAttribute) {
RequestContextHolder.currentRequestAttributes()
.setAttribute(TOKEN_HEADER_NAME, strAttribute, RequestAttributes.SCOPE_REQUEST);
return strAttribute;
}
} catch (IllegalStateException e) {
LOG.debug("Not in a request context: Creating new token for outgoing request.", e);
}
return UUID.randomUUID().toString();
}
}
In spring boot 3 is there an interface equivalent to feign.RequestInterceptor for webclient or http interfaces ?
I've been searching for several hours but to no avail.