SpringGateway 构建全局缓存 Request 解决 body 不可重复读问题

吴书松
吴书松
发布于 2025-11-26 / 2 阅读
0
0

SpringGateway 构建全局缓存 Request 解决 body 不可重复读问题

增加全局缓存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;
    }
}


评论