You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3 WebFlux如何实现类似Spring Boot 2的共享响应式上下文?

Spring Boot 3/新版WebFlux中共享响应式上下文获取ServerHttpRequest的实现

在Spring Boot 3对应的Reactor 3.4+版本中,旧的subscriberContext() API已被废弃移除,取而代之的是基于Context的新上下文API。我们可以通过以下两种方式实现请求上下文的共享,从而在任意位置获取ServerHttpRequest对象:

方式一:自定义Filter实现

1. 编写上下文传递Filter

替换旧的subscriberContext调用为新的contextWrite方法,将请求对象写入响应式上下文:

@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public class ReactiveRequestContextFilter implements WebFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        return chain.filter(exchange)
                .contextWrite(context -> context.put(ReactiveRequestContextHolder.CONTEXT_KEY, request));
    }
}

2. 编写上下文持有工具类

使用Mono.deferContextual延迟获取上下文,替代旧的Mono.subscriberContext():

public class ReactiveRequestContextHolder {
    public static final Class<ServerHttpRequest> CONTEXT_KEY = ServerHttpRequest.class;

    public static Mono<ServerHttpRequest> getRequest() {
        return Mono.deferContextual(contextView -> 
                Mono.just(contextView.get(CONTEXT_KEY))
        );
    }
}

3. 控制器中使用

用法和Spring Boot 2中基本一致,通过工具类获取请求对象:

@RestController
public class GetRequestController {

    @GetMapping("/request")
    public Mono<String> getRequest() {
        return ReactiveRequestContextHolder.getRequest()
                .map(request -> request.getHeaders().getFirst("user"));
    }
}

方式二:使用Spring内置Filter简化实现

Spring WebFlux已经内置了ServerWebExchangeContextFilter,它会自动将ServerWebExchange实例写入响应式上下文,我们可以直接利用这个Filter来简化代码:

1. 上下文持有工具类

直接从上下文中获取ServerWebExchange,再从中提取ServerHttpRequest:

public class ReactiveRequestContextHolder {
    public static Mono<ServerHttpRequest> getRequest() {
        return Mono.deferContextual(contextView -> 
                Mono.just(contextView.get(ServerWebExchangeContextFilter.EXCHANGE_CONTEXT_KEY))
        )
        .map(ServerWebExchange::getRequest);
    }
}

2. 控制器使用

和方式一的控制器代码完全一致,无需自定义Filter,Spring会自动处理上下文传递。


内容的提问来源于stack exchange,提问作者François Poirier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:40:26