3.1 WebFilter获取并保存
首先,在WebFilter
中获取Request
对象并保存,代码如下:
@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) .subscriberContext(ctx -> ctx.put(ReactiveRequestContextHolder.CONTEXT_KEY, request)); } } |
从ServerWebExchange
中获取到ServerHttpRequest
对象,再通过put
方法把它放进Context
里。
3.2 工具类Holder
实现一个工具类来提供静态方法,在Filter
后的任何场景都可以使用:
public class ReactiveRequestContextHolder { public static final Class<ServerHttpRequest> CONTEXT_KEY = ServerHttpRequest. class ; public static Mono<ServerHttpRequest> getRequest() { return Mono.subscriberContext() .map(ctx -> ctx.get(CONTEXT_KEY)); } } |
3.3 在Controller中使用
我们尝试在Controller
中使用ReactiveRequestContextHolder
来获取Request
:
@RestController public class GetRequestController { @RequestMapping ( "/request" ) public Mono<String> getRequest() { return ReactiveRequestContextHolder.getRequest() .map(request -> request.getHeaders().getFirst( "user" )); } } |
上面方法获取了Request
对象,然后再获取了Request
中的Header
。
启动应用,测试如下:
$ curl http: //localhost :8088 /request -H 'user: pkslow' pkslow $ curl http: //localhost :8088 /request -H 'user: larry' larry $ curl http: //localhost :8088 /request -H 'user: www.pkslow.com' www.pkslow.com |
可以成功获取请求头user
。
4 总结
以上就是如何在Spring WebFlux的任何地方获取Request对象的