Description
In servlet environment, when migrating RestTemplate
to WebClient
, one of the challenges people face is to access http request bound objects within WebClient
filters(ExchangeFilterFunction
).
I think this is an area currently lacking a support.
For example, SecurityContext
, Locale/LocaleContext
(LocaleContextHolder
), HttpServletRequest
(RequestContextHolder
) and any values associated to the request(ThreadLocal
) cannot easily be retrieved in ExchangeFilterFunction
.
I think common solution for this is to use Hooks
to populate the values to subscriber's context.
For example, in Spring Security, here defines and registers a hook that populates SecurityContext
.
Since this mechanism also populates HttpServletRequest
and HttpServletResponse
, I leverage it in my exchange filter functions to retrieve request bound values.
I also have similar logic for MDC and LocaleContext
.
I think this mechanism should be supported in Spring Framework itself; so that, all downstream libraries and application can leverage it.
For implementation perspective, for example, define a class ReactorContextAttribute
which is a map kept in thread local. Then, framework guarantees to populate this map in subscriber's context. So that, users or downstream libraries can simply populate this map in request thread, then retrieves values from the map in subscriber context.
In addition, FrameworkServlet
/DispatcherServlet
resolved value/context, such as LocaleContext
, can be placed in this map to make them accessible in exchange filter functions.
If such mechanism exists, for example, Spring Security can simply add a logic to populate SecurityContext
.
I think this is a big missing piece to use WebClient
in servlet environment along with supporting MDC.