Spring cloud gateway 获取RequestBody
在gateway中获取请求的json 数据
文章目录
- Spring cloud gateway 获取RequestBody
- 环境
- 一、自定义读取RequestBody的bean
- 二、自定义根据数据判断是否继续路由的bean
- 三、修改路由配置
- 四、怎么获取
- 创建全局过滤
- 结束
环境
项目开发所在环境
名称 | 版本号 |
---|---|
spring cloud alibaba | 2021.0.4.0 |
spring gateway | 3.1.6 |
spring boot | 2.6.11 |
提示:以下是本篇文章正文内容,下面案例可供参考
一、自定义读取RequestBody的bean
此类主要继承 ReadBodyRoutePredicateFactory 一定要自己查看下此类
import org.springframework.cloud.gateway.handler.predicate.ReadBodyRoutePredicateFactory;import org.springframework.stereotype.Component;@Componentpublic class JsonReadBodyRoutePredicate extends ReadBodyRoutePredicateFactory {// 此类可重写,亦可不重写 ,根据自己需要// 父类方法完全够我用的,所以不做改动}
二、自定义根据数据判断是否继续路由的bean
继承Predicate 由于我们能的json 是字符串 所以是String类型
import org.springframework.stereotype.Component;import java.util.function.Predicate;@Componentpublic class JsonRequestBodyPredicate implements Predicate{ @Override public boolean test(String reqJson) { // 这里可以根据 请求字符串 或者 自行添加 path 来判断是否需要继续路由 return true; }}
三、修改路由配置
(新增) 表示 需要添加的配置
spring: cloud: gateway: discovery: locator: enabled: true routes: - id: user-server-route uri: lb://user-server predicates: - Path=/user-api//全局过滤器必须实现两个接口:GlobalFilter、Ordered//GlobalFilter是全局过滤器接口,实现类要实现filter()方法进行功能扩展//Ordered接口用于排序,通过实现getOrder()方法返回整数代表执行当前过滤器的前后顺序@Componentpublic class GatewayGlobalFilter implements GlobalFilter, Ordered { private static final Logger log = LoggerFactory.getLogger(GatewayGlobalFilter.class); private static final String SERVICE_TIME_BEGIN = "serviceTimeBegin";// 这个放我 我写了记录 接口耗时的方法 有其他需求自行填写 @Override public Monofilter(ServerWebExchange exchange, GatewayFilterChain chain) { // 记录请求时间 和 ip ServerHttpRequest request = exchange.getRequest(); if (null == request) { exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND); return exchange.getResponse().setComplete(); } List remoteAddressList = request.getHeaders().get("Remote_address");// 当走nginx转发时,获取此值 真实用户IP String remoteAddressStr = (null != remoteAddressList && !remoteAddressList.isEmpty()) ? remoteAddressList.get(0) : "empty"; exchange.getAttributes().put(SERVICE_TIME_BEGIN, System.currentTimeMillis()); // 如果需要获取请求头 ,只支持json,其他格式无法解析// Object reqJson = exchange.getAttributes().get("cachedRequestBodyObject"); return chain.filter(exchange).then(Mono.fromRunnable(() -> { long endTime = System.currentTimeMillis(); Long startTime = exchange.getAttribute(SERVICE_TIME_BEGIN); Optional.ofNullable(startTime).ifPresent(l->{ String reqPath = request.getRemoteAddress()+"("+Optional.ofNullable(remoteAddressStr).orElse("empty")+")" + "|" + request.getPath() + "| cost " + (endTime - startTime) + "ms"; log.warn(reqPath); }); })); } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; }}