Как получить контекст текущего запроса в spring-webflux

В классическом spring -mvc можно установить атрибуты области запроса для RequestContextHolder. Основываясь на этом, мы можем анализировать входящий запрос в HandlerInterceptorAdapter, устанавливать параметры запроса, такие как текущий авторизованный пользователь, уникальный идентификатор запроса (для корреляции журнала) и так далее. Эти атрибуты запроса можно получить статически из любой службы (не только из контроллеров) в течение срока действия запроса.

Я пытаюсь добиться чего-то подобного с помощью spring -webflux.

Я мог бы использовать WebFilter, чтобы перехватывать все входящие запросы, получать текущий ServerWebExchange и устанавливать для него атрибуты. Однако я не вижу способа получить ServerWebExchange текущего запроса где-либо еще, кроме методов контроллера.

Я ищу лучшее решение, чем передавать ServerWebExchange (или ServerHttpRequest) всем подряд.

Похоже, что в webflux этого сложно достичь, поскольку мы не можем полагаться на сохранение переменных, связанных с конкретным запросом, в ThreadLocal (из-за неблокирующей архитектуры один поток может переключаться между запросами в середине полета).
Тем не менее, это важное требование. Может есть другой подход?


person Doron Gold    schedule 15.05.2017    source источник
comment
Прошло почти 3 года. Были ли обновления по этому поводу?   -  person Andrew T Finnell    schedule 07.05.2020
comment
@AndrewTFinnell, см. Эту проблему, которую я тогда открыл: github.com/spring -projects / spring-framework / issues / 20239. Я перестал следить за этой проблемой, потому что моя команда перешла с Spring-webflux обратно на Spring-MVC, но похоже, что есть некоторый прогресс.   -  person Doron Gold    schedule 09.05.2020


Ответы (1)


Подходы, которые вы описываете, поддерживаются в настоящее время. Как вы подчеркнули, использование статического подхода с ThreadLocals невозможно.

Reactor изучает альтернативы с новой функцией контекста (см. этот PR). Spring, скорее всего, подберет это и будет использовать, но не обязательно для атрибутов запроса, поскольку текущая модель подходит довольно хорошо.

Если вы хотите, чтобы конкретная точка расширения перехватывала запросы, создайте проблему JIRA в проекте Spring Framework, описав чего вы пытаетесь достичь и где что-то не получается.

person Brian Clozel    schedule 16.05.2017
comment
Возможно, вы захотите найти вдохновение в библиотеке HATEOAS - github.com/spring-projects/spring-hateoas/blob/master/src/main/ и github.com/spring-projects/spring- hateoas / blob / master / src / main / - person Jan Mares; 13.05.2019