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<Void> 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;
|
}
|
}
|