Spring WebFlux获取Request对象工具

3.1 WebFilter获取并保存

首先,在WebFilter中获取Request对象并保存,代码如下:

@Configuration@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)public class ReactiveRequestContextFilter implements WebFilter {@Overridepublic 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

@RestControllerpublic 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对象的

Leave a comment

Your email address will not be published. Required fields are marked *