增加全局缓存Request过滤器
/**
* 全局缓存获取body请求数据(解决流不能重复读取问题)
*
* @author Lion Li
*/
@Component
public class GlobalCacheRequestFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 只缓存json类型请求
String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE);
boolean flag = StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
// 不是json放行
if (!flag) {
return chain.filter(exchange);
}
// 使用 Gateway 自带工具 构建缓存body
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;
}
}