1. Обзор
В этом уроке мы рассмотрим WebClient фильтры в Spring WebFlux , функциональный, реактивный веб-фреймворк.
2. Фильтры запросов
Фильтр может перехватывать, проверять и изменять запрос (или ответ) клиента. Фильтры очень подходят для добавления функциональности в каждый отдельный запрос, так как логика остается в одном месте. Примеры использования включают мониторинг, изменение, ведение журнала и проверку подлинности клиентских запросов, и это лишь некоторые из них.
Запрос содержит упорядоченную цепочку из нуля или более фильтров.
В Spring Reactive фильтры являются экземплярами функционального интерфейса Функция фильтра обмена . Функция фильтра имеет два параметра: Запрос клиента для изменения и следующая Функция фильтра обмена .
Обычно функция фильтра возвращает результат, вызывая следующую функцию в цепочке фильтров:
ExchangeFilterFunction filterFunction = (clientRequest, nextFilter) -> { LOG.info("WebClient fitler executed"); return nextFilter.exchange(clientRequest); };
3. Фильтрация веб-Клиентов
После реализации фильтра запросов мы должны “прикрепить” его к экземпляру WebClient . Это можно сделать только при создании веб-клиента .
Итак, давайте посмотрим, как создать Веб-клиент . Первый вариант-вызвать WebClient.create() с базовым URL-адресом или без него:
WebClient webClient = WebClient.create();
Это, к сожалению, не позволяет добавить фильтр. Тогда второй вариант-это тот, который мы ищем.
С помощью Web Client.builder() мы можем добавлять фильтры :
WebClient webClient = WebClient.builder() .filter(filterFunction) .build();
4. Пользовательский Фильтр
Давайте начнем с фильтра, который подсчитывает HTTP-запросы GET, отправленные клиентом.
Фильтр проверяет метод запроса и увеличивает “глобальный” счетчик в случае запроса GET:
ExchangeFilterFunction countingFunction = (clientRequest, nextFilter) -> { HttpMethod httpMethod = clientRequest.method(); if (httpMethod == HttpMethod.GET) { getCounter.incrementAndGet(); } return nextFilter.exchange(clientRequest); };
Второй фильтр, который мы определим, добавляет номер версии к URL-адресу запроса. Мы используем метод Client Request.from() для создания нового объекта запроса из текущего и установки измененного URL-адреса.
Впоследствии мы продолжим выполнение цепочки фильтров с новым измененным объектом запроса:
ExchangeFilterFunction urlModifyingFilter = (clientRequest, nextFilter) -> { String oldUrl = clientRequest.url().toString(); URI newUrl = URI.create(oldUrl + "/" + version); ClientRequest filteredRequest = ClientRequest.from(clientRequest) .url(newUrl) .build(); return nextFilter.exchange(filteredRequest); };
Далее давайте определим фильтр для регистрации методов отправленных запросов вместе с их URL-адресами. Эти сведения доступны в объекте запроса.
Все, что нам нужно сделать, это распечатать какой-нибудь выходной поток:
ExchangeFilterFunction loggingFilter = (clientRequest, nextFilter) -> { printStream.print("Sending request " + clientRequest.method() + " " + clientRequest.url()); return nextFilter.exchange(clientRequest); };
5. Стандартный Фильтр
Наконец, давайте рассмотрим базовую аутентификацию – очень распространенный вариант использования фильтрации запросов.
Вспомогательный класс Функции фильтра обмена предлагает функцию базовой аутентификации() фильтра, которая заботится о добавлении заголовка авторизации в запрос.
В результате нам не нужно определять для него фильтр:
WebClient webClient = WebClient.builder() .filter(ExchangeFilterFunctions.basicAuthentication(user, password)) .build();
6. Заключение
В этой короткой статье мы рассмотрели фильтрацию клиентов веб-потока весной.
Как всегда, пример кода можно найти в на GitHub .