Добавление и настройка 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-заголовков и подстроить контент приложения под неё.
Безопасность и авторизация
Перехватчики помогут провести проверку аутентификационных токенов или заголовков авторизации.
Распределенное трассирование
В микросервисной архитектуре перехватчики могут обрабатывать заголовки трассировки, что упрощает мониторинг и диагностику проблем.
Трансформативное перехватывание
Вы можете полностью изменить запрос, например, обернуть тело запроса в стандартный формат перед тем, как отправить его контроллеру.