当前位置:

spring-cloud-gateway报错The body is not set. Did handling complete with success

访客 2024-02-07 1468 0

为了提高接口安全性,防止初级黑客直接手机抓包,因此在springcloudgateway增加了一层加解密协议,但是在和客户端对接加解密过程中,收到手机端反馈调用新接口报错,而老的未加密接口,则没有报错。手机端没有明确提示错误,只是告知服务器端响应500状态码。通过日志我发现,服务器端显示如下错误:

这是加解密全局过滤器报的错误。看到提示“Thebodyisnotset.Didhandlingcompletewithsuccess”,我首先怀疑客户端是不是没有传递body?因此还跟手机端理论了一会儿,但是手机端也很硬气,“我调用未加密接口”就不报错。

好吧,我安抚一下,暗示自己要用代码来征服对方。

百度,谷歌了一大片,焦头烂额,没有找到答案,心里想,完了,又遇到短板了。难道要苦读springcloudgateway的源码么?这问题怎么跟手机端交代呢?完了,架构师要丢人了。

过了好长时间,整理了一下烦躁的情绪,拿出必死的决心,干!

重新梳理了一下问题:

1、手机端在非加密接口请求没有问题,同样的参数和数据,在加密端有问题。这个是毋庸置疑了。

2、其他接口加解密没有问题,就这个接口有问题。

3、这个接口是一个上传附件的接口,一个附件上传也没有问题,增加到2个附件的时候,就报错。接口采用base64编码上传附件。

突然一个年头闪现在脑海,是不是也是因为请求数据量太大的原因。之前测试加解密接口时,因为一个接口返回的数据量太大,网关也报了一次错。这次是不是相同的解决方法?

于是赶紧查看上次解决问题都变更的记录。这个查看变更过程也很曲折,因为上次解决完问题,不是一次性提交的代码(分了好几次提交),导致我法完快速查找出整个问题的改动。又过了半天,终于理清了思路,解决了这个问题。

解决方法如下:

1、在ModifiedRequestDecorator中增加ServerCodecConfigurer类,ModifiedRequestDecorator中的filter方法中,messageReaders从ServerCodecConfigurer中获取。

核心代码如下:

2、在全局filter中,把spring管理的ServerCodecConfigurer注入进来,并在spring配置文件中配置大小为spring.codec.max-in-memory-size=5242880我这里默认设置的是5M,可以结合实际情况进行修改。

问题完美解决

2022年10月26日补充

今天发现另外一个问题,也会导致报Thebodyisnotset.Didhandlingcompletewithsuccess的异常。那就是当http请求的body为空时,在程序中,如果没有处理好,也会报错。

修改方法是,当遇见空的body请求时,返回空字符串即可。

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~