| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> OpenFeign引起的HTTP Status 400与Tomcat吞没数据 -> 正文阅读 |
|
[Java知识库]OpenFeign引起的HTTP Status 400与Tomcat吞没数据 |
OpenFeign拦截器在微服务中比较常见的场景:前端带了JWT令牌请求服务A,在服务A中使用Feign远程调用服务B、服务C等,A、B、C都接入了Spring Security;此时就会存在这样的需求,如服务A调用服务B、C时不带有JWT令牌就会出现服务调用失败,无法通过服务B、C鉴权认证; 此时需要通过Feign提供的RequestInterceptor拦截器将A请求头中所持有的Token在Feign发起远程调用时继续传递给服务B、服务C; Demo示例代码:
导致的问题这种简单粗暴全部将Header向下传递的方法将出现意想不到的副作用,导致程序请求调用失败; 上面Demo代码,如发生如上图所示的服务调用,将产生服务调用失败,HTTP 400异常; 以下分析环境为Spring Boot2.7,使用内置tomcat 9.0.65;
服务A调用服务B成功完成请求,在服务A继续发起的feign调用服务C出现如下异常,Tomcat无法解析该请求,抛出异常,此时请求头已经被破坏:
从异常中明显可以看出Tomcat在解析请求行时出现异常,但具体什么原因引起的还将要debug Tomcat源码才能发现问题所在; 问题跟踪在Tomcat中从抛出异常的类处添加日志输出,跟踪问题; 1、在Http11InputBuffer类的parseRequestLine方法中添加打印日志:可看到两个请求的请求头信息: 服务A对服务B发起的Get请求信息,如上所述,Header头全部带上了:
服务A对服务C发起的Put请求信息,但请求头并不完整;请求行已不见,请求头也只剩部分,请求体完整,这也是为什么抛出请求行解析失败的原因;
第一个Get请求,虽然附加了content-length: 74,但并不影响请求;第二个Put请求,请求头直接被破坏;通过private boolean fill(boolean block)方法的日志发现,Put请求接收时HTTP请求头还是完整的; 在Parameters类的processParameters方法中并没有对Get请求读取Content-Length长度的数据,目前只能从Get请求完成之后、Put头解析之前的代码进行跟踪分析,还是在Http11InputBuffer类中,在每个请求结束之后都会执行如下方法:
此方法将会根据吞没机制配置与remaining字节数对byteBuffer数据进行吞没; 根据吞没配置与上个请求完成后所剩余的字节数remaining,对数据byteBuffer数据进行吞没; 在此可看到吞没掉的字节数为74,为第一个请求头所携带的contentLength数据,第二个Put请求头所丢失的数据; 如Feign调用为Get、Put、Put请求;Get、Get、Get请求将不会有异常情况出现,上述异常情况为:Put、Get、Put请求;之所以remaining会剩余74是因为Tomcat并不会对Get请求从byteBuffer读取Content-Length所传输的字节数据;当请求没有导致吞没机制发生时就不会出现异常情况; |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:09:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |