Feign Client - заголовок динамической авторизации

У меня есть сервис, который получает HTTP-запрос с заголовком авторизации. При обработке запроса я хочу использовать Feign Client для запроса другого сервиса. Запрос к другому сервису должен включать тот же заголовок авторизации.

В настоящее время я использую фильтр, чтобы извлечь заголовок авторизации из входящего запроса, сохранить заголовок в ThreadLocal. При сборке Feign Client я использую RequestInterceptor, чтобы прочитать заголовок авторизации из ThreadLocal и поместить его в запрос к другому сервису.

Этот подход не идеален, потому что когда я начинаю использовать такие вещи, как RxJava или Hystrix, потоки меняются при обработке запроса, и мне приходится перемещать заголовок авторизации ThreadLocal из одного потока в другой.

Какие есть другие варианты решения этой проблемы? Один из способов, о котором я думаю, - это создание нового FeignClient для каждого запроса. Таким образом, мне больше не нужно будет хранить авторизацию в локальном потоке. Но разве это хорошая идея?

1 ответ

Решение

Я думаю, что нашел решение для моей проблемы. С помощью RequestContextHolder Я могу получить ссылку на исходный запрос (также из порожденных дочерних потоков) и скопировать оттуда заголовок:

public class AuthForwardInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        template.header(HttpHeaders.AUTHORIZATION, request.getHeader(HttpHeaders.AUTHORIZATION));
    }
}
Другие вопросы по тегам