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.
To my knowledge there is no interceptor mechanism. However, they do provide an alternative (in my view better) strategy for solving your type of problem, ie adding a header to every request in a way that it’s fresh.