修改经过Spring Gateway的Json数据

背景

使用Spring Cloud Gateway作为网关时经常会需要对报文内的json数据进行修改,但是目前看到的实现方法看起来都很复杂,这里提供一种使用Spring官方提供的ModifyRequestBodyGatewayFilterFactory类来修改json报文的方法

依赖

  • Spring Boot版本:2.7.15
  • Hutool: 5.8.21
  • Java: 11

实现逻辑

实现分为两个部分

  • filter:在自定义的filter内注入ModifyRequestBodyGatewayFilterFactory类,然后调用,该类会自动完成对修改结果的重新包装。
  • service: 自定义的service实现ModifyRequestBodyGatewayFilterFactory类的RewriteFunction<T, R>接口完成对json数据的处理

自定义filter

@Component
@Slf4j
public class RequestModifyFilter implements GlobalFilter, Ordered {
 @Autowired
 private ModifyRequestBodyGatewayFilterFactory modifyRequestBodyFilter;
 @Autowired
 private JsonRequestBodyRewriteService jsonRequestBodyRewriteService;
 @Override
 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
 MediaType mediaType = exchange.getRequest().getHeaders().getContentType();
 if (MediaType.APPLICATION_json.isCompatibleWith(mediaType)) {
 // 纯json报文处理逻辑
 return modifyRequestBodyFilter
 .apply(
 new ModifyRequestBodyGatewayFilterFactory.Config()
 .setRewriteFunction(byte[].class, byte[].class, jsonRequestBodyRewriteService))
 .filter(exchange, chain);
 } else {
 return filter(exchange, chain);
 }
 }
 @Override
 public int getOrder() {
 return OrderConstant.REQUEST_MODIFY_FILTER.getOrder();
 }
}

自定义service

@Service
@Slf4j
public class JsonRequestBodyRewriteService implements RewriteFunction<byte[], byte[]> {
 @Override
 public Publisher<byte[]> apply(ServerWebExchange exchange, byte[] body) {
 jsonObject request = jsonUtil.parseObj(body);
 log.info("原始报文:{}", request.toString());
 try {
 request.set("empId", "2345");
 request.set("department", "Engineering");
 log.info("修改后报文:{}", request);
 return Mono.just(request.toString().getBytes());
 } catch (Exception e) {
 log.error("修改报文时出错",e);
 throw e;
 }
 }
}

相关代码

https://github.com/eastcukt/demo-gatway

参考

https://amitkhurana92.medium.com/request-body-transformation-in-spring-cloud-gateway-bb9c234d5f3d

作者:加菲猫不加肥诶原文地址:https://www.cnblogs.com/hqdong123/p/17707203.html

%s 个评论

要回复文章请先登录注册