0

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.

1 Answers1

0

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.

@Bean(“tokenedWebClient”)
public WebClient webClient() {
    return WebClient.builder()
    .baseUrl(someConfiguration.getApiUrl())
    .clientConnector(buildTimeoutConnector())
    .defaultHeaders(new Consumer<HttpHeaders>() {
      @Override
      public void accept(HttpHeaders httpHeaders) {
        httpHeaders.addAll(createHeaders());
      }
    })
    .build();
}

private HttpHeaders createHeaders() {
    HttpHeaders headers = new HttpHeaders();
    String traceToken = computeTraceTokenIfAbsent();
    headers.add(TOKEN_HEADER_NAME, traceToken);
    return headers;
}
John Williams
  • 4,252
  • 2
  • 9
  • 18