大家在使用springcloud自己的gateway作为网关服务时,可能会不小心遇到自定义的Filter处理请求Request报文时出现400的错误,而且这个错误还不是每次请求都必现,额什么意思?难不成你是说请求还时好时坏?bingo!就是这么邪乎,这个问题让我也头疼了好是一阵,but最后还是被我攻克啦(出现问题不解决?可不是我的风格!)!那么在这里就跟大家分享一下此问题的解决思路,如果有帮助到您,还请继续关注我的后续文章,谢谢。

  • 问题描述: 客户端请求网关服务时,当前后两次请求时间间隔大概5分钟内时(超过5分钟经测试发现请求正常),第二次请求会出现400 BadRequest错误!android必现,iOS出现频率较低。
  • 解决思路:
  1. 注释掉除用于处理解密的filter(此filter无法注释掉,因为客户端正常请求必须要经过此filter处理,否则将出现无法访问的网关内部异常错误)之外的所有自定义filter,目的是排除法查找是否由于某一个filter写法存在问题所导致。-结论:仍出现400,定位问题失败!
  2. 回顾问题描述,因为不是每次请求都会出现400,同时5分钟为一个关键时间周期,认为可能需要设置请求时间参数,但检查后确认在使用的框架中无此功能,故决定升级Springcloud和SpringBoot到最新版( Hoxton.RELEASE、SpringBoot2.2.4),目的是确认是否是因为框架自身版本低的bug所导致。-结论:仍出现400,定位问题失败!
  3. 以上思路1和2均验证失败后,最终尝试将问题定位到思路1中无法注释掉的用于处理解密的filter。采取排除法将此filter中的代码依次注释掉定位是由于哪个位置导致的400。-结论:发现问题所在位置,是由于接收到的请求没有Content-Type项,导致走到了默认的返回Mono.empty()。
  • 解决方案:

采用设置双保险策略。 设置保险1:为了提高处理效率,当前filter解密报文之前就进行判断,针对Content-Type等于null的情况,直接return chain.filter(exchange),交由下一个filter处理,filter链条继续。 设置保险2:针对类似Content-Type等于null的特殊异常情况,在研究Mono类的用法时发现,存在Mono.empty()、Mono.just()、Mono.JustorEmpty()共计三种方法,故使用Mono.JustorEmpty(data),通过判断data是否为空,来执行empty或者执行正常的just(data不为空执行just),走完如场景重现(见下文)中的index=6之后余下所有的filter,直到执行完成,正常结束所有filter处理。

  • 解决效果: 策略应用后经测试没再出现400的情况,但是出现问题的原理有待进一步分析。
  • 问题原理: 客户端请求网关时,经过Filter处理时,由于接收到的请求headers中会出现Content-Type为null的情况(这个就需要客户端的兄弟们检查一下请求接口中是否有漏传的情况啦),从而导致原有的filter中判断条件不满足,因为之前没有遇到Content-Type等于空的情况,所以Content-Type为空的时候默认就给他返回了Mono.empty(),执行了Mono.empty()之后,就认为所有的filter都执行完成了,filter链条处理结束。但是实际上,Content-Type等于空的时候,只执行到了如场景重现(见下文)中索引index=6的filter,此时filter链条并没有执行完成,直接结束就出现了400。
  • 场景重现: 当前filter中判断到Content-Type为null,执行chain.filter(exchange),debug断点跟踪,如下图所示,解密filter的index=5,经过执行后现在已切换到了下一个filter即index=6,紧接着执行chain.filter(exchange)后面的Mono.empty(),从而导致filter链条提前结束,出现400。

好了,说到这里就先暂时告一段落啦,希望我的答疑能够帮助到大家!武汉加油!加油中国 !

file_get_contents请求失败处理_SpringCloud Gateway网关处理请求过程中遇到400Bad Request问题解决方案...相关推荐

  1. 设备描述符请求失败_如果用户发出过多请求 苹果将取消Apple ID帐户恢复

    出于安全原因,恢复丢失的苹果ID帐户可能需要几天时间,但如果用户希望顺利恢复,则该避免采取一些行动.任何人都可能忘记他们的Apple ID密码,因此该公司必须为用户提供一种方法,让用户在他们忘记密码的 ...

  2. tp监控连接云路由服务器失败_TP ID提示发送请求失败怎么办?TP-Link ID发送请求失败现象的原因及解决方案...

    有时候在创建.登录.注销TP-LINK ID,或者在找回TP-LINK ID的密码.在线升级.刷新精选应用等与云服务有关操作时,路由器或APP界面可能提示"TP-Link ID发送请求失败, ...

  3. corspost请求失败_vue项目CORS跨域请求500错误,post请求变options请求

    vue项目CORS跨域请求500,post请求变options请求,到底是什么情况. 提示:以下内容是一个非专业开发的我对跨域的理解,并不10分准确. 一.先介绍为什么明明发送的是Post请求,为什么 ...

  4. php curl发送post请求失败,php 利用curl发送post请求

    利用curl发送post请求完成数据,接口的访问,这里面的参数可以修正一下,就可以写成可以支持文件上传的一个post请求,但是我这里不做仔细的写了.等以后有时间了在考虑怎么分解这个方法: /** * ...

  5. 711 发送请求失败_30秒上手新一代 Http 请求神器 RxHttp

    本文出自「掘金社区」,欢迎戳「阅读原文」链接和作者进行技术交流

  6. Gateway—网关服务

    ⼀.网关介绍 使用服务网关作为接口服务的统⼀代理,前端通过网关完成服务的统⼀调用 网关可以干什么? 路由:接口服务的统⼀代理,实现前端对接⼝服务的统⼀访问 过滤:对用户请求进行拦截.过滤(用户鉴权). ...

  7. 711 发送请求失败_会不会存在不失败的代理IP?

    会不会存在不失败的代理IP?这个问题应该也是很多代理IP使用者心里的疑问,不存在失败的代理IP,也就是100%的成功率.之前也有很多用户问过神龙代理客服,有没有100%的成功率的代理IP,我们的答案是 ...

  8. GA/T1400文档请求失败消息返回提

    GA/T1400 文档请求失败消息返回指的是当你在请求 GA/T1400 标准文档时,服务器返回的消息告诉你请求失败.这可能是由于请求的文档不存在或者因为服务器遇到了问题而无法响应请求.你应该检查你的 ...

  9. Android 10 上使用WifiNetworkSpecifier 连接WiFi后http请求失败 Connection failed

    问题描述:在连接设备热点的开发中,使用WifiNetworkSpecifier连上设备热点,再切换回原网络后,http请求一直报SocketException: Connection failed ( ...

最新文章

  1. 我什么时候应该使用结构而不是类?
  2. telnet与ssh的配置
  3. webservice入门程序学习中经验总结
  4. '0','\0',NULL,EOF的区别
  5. 用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!
  6. Java的几个同步辅助类
  7. python 轨迹预测_CVPR 2019轨迹预测竞赛冠军方法总结
  8. LeetCode:Rotate Image
  9. Ubuntu下安装中文输入法
  10. Spring Boot(一)入门篇
  11. android fragment面试,Android fragment之间传递数据的方式?
  12. bzoj 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛(floyd)
  13. RPC架构简介与原理
  14. 用QLabel实现抽奖
  15. java实现公式解析
  16. python后退快捷键_IntelliJ IDEA的后退快捷键是什么?
  17. 从根上理解高性能、高并发(七):深入操作系统,一文读懂进程、线程、协程
  18. 庄子:当你一事无成,感到茫然无助时,读懂这几句话,会让你重新看待人生
  19. PS超简单的扣人像方法
  20. 大数据产业助力上饶经济转型

热门文章

  1. python添加环境变量_windows系统下python学习-1 (python环境变量配置)
  2. 怎么判断自己适不适合读博士?
  3. 中国什么时候才能全面普及 1 Gbps 下行的网速?
  4. div独占一行 html_web前端基础-HTML及CSS选择器
  5. 强行更改linux服务器时间,加强Linux服务器安全的20项建议
  6. MD文件图片base64自动编码
  7. java.lang.IllegalArgumentException: URLDecoder异常解决
  8. 题目1335:闯迷宫( BFS在求解最短路径或者最短步数上有很多的应用)
  9. SLS多云日志采集、处理及分析
  10. 金融行业怎么用AI?蚂蚁金服是这么做的