修改经过Spring Gateway的Json数据

铁佛  金牌会员 | 2023-9-20 03:50:43 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 908|帖子 908|积分 2724

背景

使用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接口完成对json数据的处理
自定义filter
  1. @Component
  2. @Slf4j
  3. public class RequestModifyFilter implements GlobalFilter, Ordered {
  4.     @Autowired
  5.     private ModifyRequestBodyGatewayFilterFactory modifyRequestBodyFilter;
  6.     @Autowired
  7.     private JsonRequestBodyRewriteService jsonRequestBodyRewriteService;
  8.     @Override
  9.     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  10.         MediaType mediaType = exchange.getRequest().getHeaders().getContentType();
  11.         if (MediaType.APPLICATION_json.isCompatibleWith(mediaType)) {
  12.             // 纯json报文处理逻辑
  13.             return modifyRequestBodyFilter
  14.                     .apply(
  15.                             new ModifyRequestBodyGatewayFilterFactory.Config()
  16.                                     .setRewriteFunction(byte[].class, byte[].class, jsonRequestBodyRewriteService))
  17.                     .filter(exchange, chain);
  18.         } else {
  19.             return filter(exchange, chain);
  20.         }
  21.     }
  22.     @Override
  23.     public int getOrder() {
  24.         return OrderConstant.REQUEST_MODIFY_FILTER.getOrder();
  25.     }
  26. }
复制代码
自定义service
  1. @Service
  2. @Slf4j
  3. public class JsonRequestBodyRewriteService implements RewriteFunction<byte[], byte[]> {
  4.     @Override
  5.     public Publisher<byte[]> apply(ServerWebExchange exchange, byte[] body) {
  6.         jsonObject request = jsonUtil.parseObj(body);
  7.         log.info("原始报文:{}", request.toString());
  8.         try {
  9.             request.set("empId", "2345");
  10.             request.set("department", "Engineering");
  11.             log.info("修改后报文:{}", request);
  12.             return Mono.just(request.toString().getBytes());
  13.         } catch (Exception e) {
  14.             log.error("修改报文时出错",e);
  15.             throw e;
  16.         }
  17.     }
  18. }
复制代码
相关代码

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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表