Добавление и настройка HttpRequest интерцепторов в Spring Boot

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для добавления перехватчика HTTP-запросов в приложение на Spring Boot вам потребуется реализовать интерфейс ClientHttpRequestInterceptor и зарегистрировать его в RestTemplate. Сделать это можно таким образом:

Java
Скопировать код
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;
    }
}

Создать перехватчик вы можете, следуя это подсказки:

  1. Реализуйте интерфейс ClientHttpRequestInterceptor.
  2. Переопределите метод intercept().
  3. Добавьте в запрос необходимые заголовки или измените его.
  4. Зарегистрируйте перехватчик в RestTemplate.
Кинга Идем в IT: пошаговый план для смены профессии

Строим надежный механизм перехватчиков

Призовое место занимает WebMvcConfigurer

Предпочтительно использовать класс WebMvcConfigurer, а не WebMvcConfigurerAdapter, который помечен устаревшим начиная со Spring Boot 2.1.4 и постарше:

Java
Скопировать код
@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():

Java
Скопировать код
registry.addInterceptor(customInterceptor)
        .addPathPatterns("/**")
        .excludePathPatterns("/login", "/css/**", "/api/health");

Совместимость – ключ к успешной разработке

Будьте всегда в курсе совместимости версий Spring Boot при подключении перехватчиков, чтобы избежать проблем с устаревшим кодом.

Валидация и тестирование

Проверьте перехватчики на простых примерах. Это поможет вам удостовериться в правильности их работы.

Визуализация

Можно представить ваше приложение на Spring Boot в виде почтового отделения (🏢), а HTTP-запросы – как письма (📩):

Markdown
Скопировать код
🏢 До установки перехватчика: [📩, 📩, 📩]
🏢 После установки перехватчика: [✉️🕵️, ✉️🕵️, ✉️🕵️]

Письма (✉️🕵️), прошедшие через перехватчика (🕵️), можно проверить и изменить перед доставкой получателю.

Markdown
Скопировать код
В приложении на Spring Boot перехватчик HTTP-запросов даёт возможность:
1. **Перехватить** (`🕵️`) запрос.
2. **Проверить и настроить** (`🛠️`) запрос.
3. **Доставить** (`📬`) его дальше для обработки.

Подумайте о перехватчиках как о посредниках между входящими запросами и вашим приложением.

Продвинутые примеры использования

Локализация и интернационализация

Перехватчики могут помочь определить локализацию пользователя на основе HTTP-заголовков и подстроить контент приложения под неё.

Безопасность и авторизация

Перехватчики помогут провести проверку аутентификационных токенов или заголовков авторизации.

Распределенное трассирование

В микросервисной архитектуре перехватчики могут обрабатывать заголовки трассировки, что упрощает мониторинг и диагностику проблем.

Трансформативное перехватывание

Вы можете полностью изменить запрос, например, обернуть тело запроса в стандартный формат перед тем, как отправить его контроллеру.

Полезные материалы

  1. Официальная документация Spring Boot
  2. Настройка перехватчиков в Spring Framework
  3. Статья на DZone о перехватчиках в Spring MVC
  4. Создание REST-сервисов с использованием Spring
  5. Обучающее видео по Spring MVC от канала "Java Brains"