Добавление и настройка HttpRequest интерцепторов в Spring Boot
Быстрый ответ
Для добавления перехватчика HTTP-запросов в приложение на Spring Boot вам потребуется реализовать интерфейс ClientHttpRequestInterceptor и зарегистрировать его в RestTemplate. Сделать это можно таким образом:
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.ClientHttpRequestExecution;
import java.io.IOException;
public class CustomInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
request.getHeaders().add("My-Header", "Value");
return execution.execute(request, body);
}
}
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.getInterceptors().add(new CustomInterceptor());
return restTemplate;
}
}
Создать перехватчик вы можете, следуя это подсказки:
- Реализуйте интерфейс
ClientHttpRequestInterceptor. - Переопределите метод
intercept(). - Добавьте в запрос необходимые заголовки или измените его.
- Зарегистрируйте перехватчик в
RestTemplate.

Строим надежный механизм перехватчиков
Призовое место занимает WebMvcConfigurer
Предпочтительно использовать класс WebMvcConfigurer, а не WebMvcConfigurerAdapter, который помечен устаревшим начиная со Spring Boot 2.1.4 и постарше:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private CustomInterceptor customInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor).addPathPatterns("/**");
}
}
Этот способ позволяет сохранить автоматическую конфигурацию Spring Boot и добавить возможность выборочного применения перехватчиков при помощи метода addPathPatterns().
Независимость перехватчиков
Размещайте каждый перехватчик в отдельном конфигурационном классе. Это облегчит тестирование и исключит жесткую взаимосвязь с контроллерами или сервисами.
Данные сессии и контекст пользователя
Если вам требуется доступ к атрибутам сессии или контексту пользователя, воспользуйтесь WebRequest или HttpSession в качестве аргументов методов перехватчика.
Искусство исключений
Иногда нужно отсеить некоторые запросы и не перехватывать их. Для исключения определённых путей применяют excludePathPatterns():
registry.addInterceptor(customInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login", "/css/**", "/api/health");
Совместимость – ключ к успешной разработке
Будьте всегда в курсе совместимости версий Spring Boot при подключении перехватчиков, чтобы избежать проблем с устаревшим кодом.
Валидация и тестирование
Проверьте перехватчики на простых примерах. Это поможет вам удостовериться в правильности их работы.
Визуализация
Можно представить ваше приложение на Spring Boot в виде почтового отделения (🏢), а HTTP-запросы – как письма (📩):
🏢 До установки перехватчика: [📩, 📩, 📩]
🏢 После установки перехватчика: [✉️🕵️, ✉️🕵️, ✉️🕵️]
Письма (✉️🕵️), прошедшие через перехватчика (🕵️), можно проверить и изменить перед доставкой получателю.
В приложении на Spring Boot перехватчик HTTP-запросов даёт возможность:
1. **Перехватить** (`🕵️`) запрос.
2. **Проверить и настроить** (`🛠️`) запрос.
3. **Доставить** (`📬`) его дальше для обработки.
Подумайте о перехватчиках как о посредниках между входящими запросами и вашим приложением.
Продвинутые примеры использования
Локализация и интернационализация
Перехватчики могут помочь определить локализацию пользователя на основе HTTP-заголовков и подстроить контент приложения под неё.
Безопасность и авторизация
Перехватчики помогут провести проверку аутентификационных токенов или заголовков авторизации.
Распределенное трассирование
В микросервисной архитектуре перехватчики могут обрабатывать заголовки трассировки, что упрощает мониторинг и диагностику проблем.
Трансформативное перехватывание
Вы можете полностью изменить запрос, например, обернуть тело запроса в стандартный формат перед тем, как отправить его контроллеру.


