背景
使用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
- @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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |