百度搜了一大堆文献,全部什么改源码,封装Body啥的,都很复杂,这里直接利用的 Gateway 源码中的 CacheRequestBodyGatewayFilterFactory 缓存了RequestBody,我们先让它执行,然后执行我们的逻辑,即可直接取出RequestBody。
Gateway版本:
org.springframework.cloud:spring-cloud-starter-gateway:3.1.1
直接上代码:
import com.alibaba.fastjson.JSON; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.core.Ordered; import org.springframework.http.HttpHeaders; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.util.MultiValueMap; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; import java.util.*; @Component public class RequestFilterFactory extends AbstractGatewayFilterFactory{ private static final Logger log = LoggerFactory.getLogger(RequestFilterFactory.class); static { log.info("RequestFilterFactory init"); } @Autowired private RequestFilter requestFilter; public RequestFilterFactory() { super(Config.class); } @Override public GatewayFilter apply(Config config) { log.info("进入 RequestFilterFactory"); return requestFilter; } public static class Config {} @Component public static class RequestFilter implements GatewayFilter, Ordered { private static final Logger log = LoggerFactory.getLogger(RequestFilter.class); static { log.info("RequestFilter init"); } @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("进入 RequestFilter"); String requestBody = exchange.getAttribute(ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR); log.info("requestBody:{}", requestBody); return chain.filter(exchange); } @Override public int getOrder() { // 运行顺序:CacheRequestBodyGatewayFilterFactory -> RequestFilterFactory return 2; } } }
yml 配置:
spring:
cloud:
gateway:
default-filters:
- name: CacheRequestBody
args:
bodyClass: java.lang.String
- name: RequestFilterFactory
这里我设置的是全局的过滤器,可根据个人需求设置在相应路由的filters下。
如有错误,欢迎指正;如有侵权,请联系作者。



