spring-cloud-gateway 功能-获取上下文request
基于webflux
在网关中,需要获取请求链中的request, 不像 spring mvc 可以通过 RequestContextHolder
获取
实现
ReactiveRequestContextFilter
public class ReactiveRequestContextFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
return chain.filter(exchange).subscriberContext(ctx -> {
ctx.put(ReactiveRequestContextHolder.REQUEST_KEY, request);
ctx.put(ReactiveRequestContextHolder.EXCHANGE_KEY, exchange);
return ctx;
});
}
}
ReactiveRequestContextHolder
public class ReactiveRequestContextHolder {
public static final Class<ServerHttpRequest> REQUEST_KEY = ServerHttpRequest.class;
public static final Class<ServerWebExchange> EXCHANGE_KEY = ServerWebExchange.class;
/**
* 获取 request
* @return
*/
public static Mono<ServerHttpRequest> getRequest() {
return Mono.subscriberContext().map(ctx -> ctx.get(REQUEST_KEY));
}
/**
* 获取 exchange
* @return
*/
public static Mono<ServerWebExchange> getExchange() {
return Mono.subscriberContext().map(ctx -> ctx.get(EXCHANGE_KEY));
}
/**
* 获取请求参数
* @return
*/
public static Mono<RequestParamContext> getRequestParamContext(){
return getExchange().map(exchage-> exchage.getAttribute(CACHE_REQUEST_PARAM_KEY));
}
}