Поскольку в названии уже есть «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, чтобы клиенты могли проверить то же самое на своем конце.