package org.dromara.gateway.filter; import org.dromara.gateway.utils.WebFluxUtils; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; /** * 全局缓存获取body请求数据(解决流不能重复读取问题) * * @author Lion Li */ @Component public class GlobalCacheRequestFilter implements GlobalFilter, Ordered { @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 只缓存json类型请求 if (!WebFluxUtils.isJsonRequest(exchange)) { return chain.filter(exchange); } return ServerWebExchangeUtils.cacheRequestBody(exchange, (serverHttpRequest) -> { if (serverHttpRequest == exchange.getRequest()) { return chain.filter(exchange); } return chain.filter(exchange.mutate().request(serverHttpRequest).build()); }); } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE + 1; } }