Поскольку в названии уже есть «Decorator», оно позволяет пользователям добавлять новые функции к существующему объекту, не изменяя его структуру. В нашем случае этот объект представляет собой типичный тело HTTP-запроса/ответа, в котором мы хотим решить некоторые распространенные проблемы, такие как ведение журнала, дайджест, добавление/проверка подписи и т. д.

В Spring MVC мы можем добиться этого, используя классы ContentCachingRequestWrapper и ContentCachingResponseWrapper, но эти классы недоступны в Spring WebFlux, вместо этого у нас есть несколько декораторов, которые можно использовать для некоторых интересных вещей.

a) ServerWebExchangeDecorator: используется для переноса другого ServerWebExchange, который делегирует этот упакованный экземпляр

б) ServerHttpRequestDecorator: используется для переноса другого ServerHttpRequest и делегирует все методы этому обернутому экземпляру

c) ServerHttpResponseDecorator: используется для обертывания другого ServerHttpResponse и делегирует все методы этому обернутому экземпляру

Нам должно быть интересно, почему этого нельзя сделать, просто используя WebFilter.

Что ж, поскольку Spring WebFlux построен на реактивных потоках , а данные отправляются потоками байтов в виде потока, когда вы пытаетесь подписаться на эти данные, скажем, вычислить и проверить дайджест тела запроса, после которых у вас нет данных в конвейере, которые могут быть отправлены вниз и, в конечном итоге, к нашим контроллерам. В этом случае вы получите IllegalStateException от среды Spring.

Пример: проверка дайджеста с помощью декораторов WebFlux

В этом примере (используя kotlin) мы реализуем WebFilter и с помощью декораторов попытаемся проверить дайджест запроса.

Клиент отправил HTTP-запрос для вышеуказанного контроллера вместе с заголовком дайджеста (например, дайджест: SHA256=oqHsRK1EB0), и теперь серверу необходимо сверить дайджест с телом полученного запроса. Таким образом, сервер гарантирует, что тело запроса не было изменено злоумышленником и его можно безопасно обрабатывать дальше (стандартным образом этот подход расширяется с помощью заголовка подписи и открытого ключа).

Веб-фильтр запроса валидатора:

DigestExchangeDecorator:

Декоратор DigestRequestDecorator:

Подразделение:

Аналогичным образом можно создать декоратор ответа, чтобы добавить к ответу заголовок подписи или отдельный заголовок JWS, чтобы клиенты могли проверить то же самое на своем конце.