首页 > 其他分享 >修改经过Spring Gateway的Json数据

修改经过Spring Gateway的Json数据

时间:2023-09-16 20:14:50浏览次数:44  
标签:exchange Spring 报文 request json public filter Json Gateway

背景

使用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

标签:exchange,Spring,报文,request,json,public,filter,Json,Gateway
From: https://www.cnblogs.com/hqdong123/p/17707203.html

相关文章

  • Spring - 1( 相关了解 + IOC 容器 + DI 依赖注入 + )
    Spring-1目录Spring-1了解SpringFramework系统架构系统架构图一、核心容器相关概念存在问题解决引出IOC仍存在问题并引出DI完成目标:充分解耦最终结果IOC入门案例分析实现DI入门案例分析实现IOC相关内容bean配置id、class基础配置name别名配置scope作用范围思考bea......
  • springmvc接收请求是每一个请求都会新开一个线程吗?——不,是线程复用
    答案是否定的这是我学习苍穹外卖时候测出来的,发现springmvc接收请求会复用线程,跟用的ThreadLocal工具类有冲突,因为用完后不会清除掉ThreadLocal中存储的值导致微信回调的支付方法使用了管理端的id,导致空指针异常。主要还是要注意springmvc接收请求是线程复用的就行了。......
  • springboot安卓音乐播放器
    开发环境及工具:大等于jdk1.8,大于mysql5.5,idea(eclipse),AndroidStudio技术说明:springbootmybatisandroid代码注释齐全,没有多余代码,适合学习(毕设),二次开发,包含论文技术相关文档。功能介绍:用户端:登录注册首页显示搜索音乐,轮播图,音乐列表点击音乐进入音乐详情(以及展示评论信息),可以点......
  • [SpringSecurity5.6.2源码分析十]:HeaderWriterFilter
    前言• 为了安全考虑,添加启用浏览器保护的某些头是很有用的,比如X-Frame-Options,X-XSS-Protection和X-Content-Type-Options• 而HeaderWriterFilter就支持往响应头写入各种响应头1、HeadersConfigurer• HeadersConfigurer是HeaderWriterFilter对应的配置类,是在获取HttpSecur......
  • springboot自动配置
    SpringBoot的自动配置功能非常强大,可以大大简化应用程序的配置。下面是一个简单的SpringBoot自动配置的例子:假设我们有一个名为@EnableMyAutoConfiguration的自定义自动配置类,其中包含一个名为@MyBean的自定义Bean:@Configuration@EnableMyAutoConfigurationpubliccl......
  • springboot vue uniapp 小说电子书阅读小程序APP源码
    开发环境及工具:大等于jdk1.8,大于mysql5.5,idea(eclipse),nodejs,vscode(webstorm),HBuilderX技术说明:springbootmybatisvueelementuiuniapp代码注释齐全,没有多余代码,适合学习(毕设),二次开发,包含论文技术相关文档。功能介绍:用户端:登录注册首页显示搜索小说,轮播图,最新发布小说(可带推荐算......
  • SpringBoot + Redis + Token 解决接口幂等性问题
    前言SpringBoot实现接口幂等性的方案有很多,其中最常用的一种就是token+redis方式来实现。下面我就通过一个案例代码,帮大家理解这种实现逻辑。原理前端获取服务端getToken()->前端发起请求->header中带上token->服务端校验前端传来的token和redis中的token是否......
  • springmvc中使用配置类进行配置,WebInit,WebConfig,SpringConfig
    2023-09-16导入的依赖<dependencies><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><de......
  • spring security为啥是个垃圾框架?
    古时候写代码,权限这块写过一个库,基本就是一个泛型接口,里面有几个方法:如验证输入的principal和credentials,返回token和authorities和roles,role就是一堆authorities集,也就说就是返回一堆authorities。然后每次请求会拿token找到authorities,然后再判断当前请求的资源(其实就是url)包不......
  • springmvc中异常配置的两种方式,一种使用注解配置,一种使用控制器配置
    2023-09-16方式一springmvc.xml<!--配置异常处理器--><beanclass="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><propertyname="exceptionMappings"><props>......