SpringCloudGateway获取请求体参数方式

1.版本说明

框架 版本
springboot 2.2.6.RELEASE
spring-cloud-alibaba 2.2.0.RELEASE
spring-cloud-gateway 2.2.0.RELEASE

2.需求

需要在网关打印请求日志, 其中需要获取POST请求的请求体参数

3.遇到的问题

  1. 按照网上查到的方案, 用在这个版本的cloud上, 全都不起作用;
  2. 请求体只能读取一次, 读取之后, 后续的过滤器将无法获取请求体数据;
  3. SpringCloudGateway使用的是webFlux响应式编程, 不太熟悉;

4.解决办法

关键: 借用 ModifyRequestBodyGatewayFilterFactory, 该类的本身功能是为了修改请求体数据的, 这里也是比较巧妙的利用了他本身已经对请求体参数进行了封装, 在RewriteFunction中可以直接拿到请求参数的特点
好处: 简单有效

注意: 在测试过程中发现只能读取到contentType为application/json的数据

@Component
@Slf4j
public class LogRecordServerRequestParamFilter implements GlobalFilter, Ordered {

    private static final int LOG_RECORD_SERVER_REQUEST_PARAM_FILTER_ORDER = -10;

    private GatewayFilter delegate;

    @PostConstruct
    public void init() {
        this.delegate = new ModifyRequestBodyGatewayFilterFactory().apply(this.getConfig());
    }

    private ModifyRequestBodyGatewayFilterFactory.Config getConfig() {
        ModifyRequestBodyGatewayFilterFactory.Config cf = new ModifyRequestBodyGatewayFilterFactory.Config();
        cf.setRewriteFunction(Object.class, Object.class, getRewriteFunction());
        return cf;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return delegate.filter(exchange, chain);
    }

    @Override
    public int getOrder() {
        return LOG_RECORD_SERVER_REQUEST_PARAM_FILTER_ORDER;
    }

    private RewriteFunction<Object, Object> getRewriteFunction() {
        return (serverWebExchange, body) -> {
         // 这里的body就是请求体参数, 类型是LinkedHashMap, 可以根据需要转成JSON
         log.info("请求体: {}", JSON.toJSONString(body))
            return Mono.just(body);
        };
    }

}

你可能感兴趣的:(SpringCloud)