Http 响应头 Transfer-Encoding : chunked 导致 浏览器客户端请求错误问题

2023-10-31

  • 生产环境服务器规划如下
服务器 类型 网络环境
cal.com nginx 外网
192.168.7.15:9200 tomcat 内网
192.168.7.16:9200 tomcat 内网
sdd.com nginx 内网
192.168.7.15:9100 tomcat 内网
192.168.7.16:9100 tomcat 内网

192.168.7.15和192.168.7.16是做个负载均衡。目前的需求是用户访问外网的cal.com 返回 内网 192.168.7.15:9200 和 192.168.7.16:9200的页面,数据需要再次请求sdd.com,sdd.com转发到内网的
192.168.7.15:9100 和 192.168.7.16:9100。

请求的流程图如图所示:

在这里插入图片描述

  • 问题描述

在cal.com上线后,用户发起请求,发现9200端口上的静态页面请求可以返回,而ajax请求数据无法返回,所有的ajax请求是做了代理的,代理到了sdd.com。既然能返回静态页面数据,说明肯定不是cal.com对应的服务器问题,而是在sdd.com这一环节存在问题,通过添加日志输出,发现可以正常请求回来数据,并写入到响应体中去,但是前端一直请求错误。

  • 解决

首先通过增加日志打印,排查方法的哪一步出现了问题,因为9200的tomcat服务器所有的静态资源是可以正常返回的,这排除了服务器问题,比较离奇的时候,所有的日志打印地方都可以正常输出,可以正常请求到sdd.com的结果,但是就是返回不了数据,这一步至少确定了 从9200发送sdd.com是没问题的。那么继续再排查其他原因,经过多次的代码反复注释,发现9200设在设置响应头的这一步出现了问题,具体的就是只要有Transfer-Encoding : chunked 就会导致浏览器报错。

经过分析此请求头发现,只要响应头中携带了这个Transfer-Encoding : chunked 标头,浏览器就会报错,只要一去掉,就不会报错。后来得知Transfer-Encoding 这是一种传输编码方式,如果存在这个标头,则表示服务器无法一次性计算出本次响应的content-length,需要将响应内容类型分段传输/分块传输给客户端,每一块都需要用一个十六进制的长度表示当前块传输内容的字节大小,当客户端收到最后一个块的大小为0时,表示此次请求完整的结束了。

错误代码:

        clientHttpResponse.getHeaders().forEach((key, value) -> value.forEach(it -> {
                response.setHeader(key, it);
        }));

这里面的关键就是 response.setHeader(key, it); 给tomcat请求设置响应头 Transfer-Encoding :chunked ,但是实际的响应体数据格式却不是chunked 分块格式,这就导致了cal.com nginx服务器在接收到tomcat服务器的响应时根本无法处理成功,进而给浏览器也报错了。

这里由于sdd.com这台nginx服务器,开启了传入编码后

location / {
        chunked_transfer_encoding       on;
}

9200端口发送请求的工具类收到sdd.com返回的数据以后,进行了正确的格式解析,此时已经获取到了完整的响应体数据,那么这时候如果再按照sdd.com的响应头信息去给cal.com传输的话,就出现问题了,因为格式明明是完整的,而响应头却设置了 Transfer-Encoding : chunked 。这就导致匹配不起来了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Http 响应头 Transfer-Encoding : chunked 导致 浏览器客户端请求错误问题 的相关文章

  • 如何将 JSpinner 的值设置为特定日期

    我有一个JSpinner我添加到JPanel我想将其时间设置为 GregorianCalendar calendar JSpinner spinner new JSpinner spinner setModel model pom add
  • 如何在 Java 中访问嵌套的 HashMap?

    我有一个 Java 中的 HashMap 其中的内容 你们可能都知道 可以通过以下方式访问 HashMap get keyname 如果一个 HashMap 位于另一个 HashMap 中 即嵌套的 HashMap 我将如何访问内容 我可以
  • Java:线程“主”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:

    我是初学者 谁能帮我弄清楚我们在做什么 我正在尝试读取字符串并将字符串的每个字符存储在数组中 import java util Scanner public class CoreMainDigitExtractor static Scann
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • JAXB 编组器无参数默认构造函数

    我想从 java 库中编组一个 java 对象 当使用 JAXB marschaller 编组 java 对象时 我遇到了一个问题 A 类没有无参数默认构造函数 我使用Java Decompiler来检查类的实现 它是这样的 public
  • 如何检查日期字符串的有效性?

    在我的项目中 我需要检查日期字符串是否计算为正确的日期对象 我决定允许 yyyy MM dd 和日期格式 年 月 日 和 年 月 日 小时 分钟 我如何检查它们是否有效 我的代码为 1980 01 01 和一些奇怪的日期 如 3837 05
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • 如何将库添加到 LIBGDX 项目的依赖项 gradle

    一切都在问题中 我已经尝试了在 SO 和其他网站中找到的所有答案 但没有运气 这就是我迄今为止尝试过的 adding compile fileTree dir lib include jar 到我的 build gradle adding
  • Tomcat 7 - 在哪里设置“系统属性”?

    自从升级到 Tomcat 7 以来 我的 Web 应用程序出现了问题 我的会话将继续null在我登录并尝试执行任何操作 提交请求 后 我读到设置以下内容可能会有所帮助 org apache tomcat util http ServerCo
  • @Embeddable 中的 @GenerateValue

    我已将实体的 id 分离到一个单独的 Embeddable 类中 该实体如下 Entity Table name users public class Users EmbeddedId private Users pk id private

随机推荐

  • C--小Why的商品归位-- 牛客小白月赛77

    输入 3 3 1 1 2 1 3 2 3 输出 2 解析 先不考虑购物车的容量 即购物车容量为无限大 这样我们可以通过每种货物上车 下车的时间计算出每一个时间点内 购物车中货物的数量 统计出所有时间点内 货物数量的最大值max 这个最大值所
  • 电商平台项目----项目搭建

    目录 项目介绍 其他配置 eslint 校验功能关闭 src文件简写方法 配置别名 项目路由分析 vue router 路由 路由组件 完成非路由组件 Header Footer 组件 步骤 配置less 路由组件的搭建 路由组件与非路由组
  • 关于微信小程序使用JavaScript求解背包问题

    背包问题求解 拟解决生活中常见的问题之一 背包问题 wxml wxss js 拟解决生活中常见的问题之一 背包问题 该问题要求在一个物品集合中选择合适的物品放入背包 在放入背包中的物品总重量不超过背包容量的前提下 希望放入背包的物品总价值最
  • 学scratch和机器人编程哪个好

    学scratch和机器人编程哪个好 小孩的学习一直都是家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说是相当耐心的 会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家
  • 电脑取消撤销快捷键是什么_电脑健盘中的所有英文组合意思超值解释建议收藏...

    电脑键盘上 所有英文键的意思 1 Esc 取消和退出键 2 Tab 表格键切换键 3 Caps Lock 字母大小写切换键 4 Shift 转换键 5 Ctrl 控制键 需要配合其他键或鼠标使用 例如复制CtrI C 6 Alt 可选 切换
  • 《Linux设备节点创建》用户空间ueventd创建设备节点规则

    转自 http blog csdn net tankai19880619 article details 11726371 说明 本文基于Android2 3和Linux2 6 其余版本仅供参考 一 devfs udev和sysfs是什么关
  • 补充对“Cannot determine link language for target”出现该问题的另外一种原因

    在上一篇的文章里面 我曾今讲解为什么会出现如下错误提示的原因 CMake Error CMake can not determine linker language for target xxxxx CMake Error Cannot d
  • Failed connect to 192.168.213.129:8080; No route to host

    在VMware虚拟机中运行tomcat 但是在主机访问虚拟机中的Tomcat的时候出现无法访问的情况 但是两者又能ping的通 在另一个虚拟机中用curl命令来运行的时候抛出如下异常 命令如下 curl XGET http 192 168
  • 为什么要坚持写博客?

    我是一个一直不喜欢做笔记的人 从小学开始一直到研究生 好记性不如烂笔头的话一直都深知其意 但是一直对它没能形成一个较为深刻的认识 感觉很耗时间 做笔记也总是找不到重点 好几次决定开始好好做笔记 记录自己的进步以及于自己有用的知识点 到头来
  • 大小堆以及TOP K问题

    完全二叉树 如上图所示 我们可以将完全二叉树的结点按照层序遍历的顺序储存在一个数组中 那么当完全二叉树中的某个结点位于array的i处时 其左子节点必位于2i 1处 i gt 0 其右结点必位于array的2i 2处 这样我们就可以轻易的实
  • 互联网摸鱼日报(2023-04-03)

    互联网摸鱼日报 2023 04 03 博客园新闻 华为为什么要守住 不造车 底线 蔚来李斌 蔚来手机将于三季度发布和交付 电商价格战 淘宝舞剑 意在何处 ChatGPT科研神器 论文翻译润色一键搞定 还能帮你读代码 一夜蹿红 又一款中国出海
  • loadrunner关于回放脚本时session失效的问题

    在使用loadrunner录制脚本后 进行回放时 会出现session已经失效的情况 为解决这个问题 就应该将请求中的userSession进行参数化 使其自动获得当前的userSession 具体脚本如下 在我们打开连接时 首先我们会向服
  • CreateEvent自动重置事件对象

    include
  • git查看和切换账号

    查看当前登录账号 git config user name 查看当前登录邮箱 git config user email 修改用户名和邮箱 git config global user name your name git config g
  • 论文理解之增加换脸效果 FaceShifter: Towards High Fidelity And Occlusion Aware Face Swapping

    论文 FaceShifter Towards High Fidelity And Occlusion Aware Face Swapping 论文地址 https arxiv org pdf 1912 13457 pdf 换脸是非常吸引人的
  • uniapp 自定义弹窗组件

    先上效果 组件源码 slot modal vue
  • npm配置文件

    npm配置文件是 npmrc 默认在用户目录下 如果没有找到 用命令来看 npm config get userconfig 查看配置文件路径 以下config命令也是很好用 npm config ls l 查看所有配置项 npm conf
  • I2C总线上的上拉电阻设置

    https wenku baidu com view 985db25e4a7302768e9939f8 fr ViewCollect i2c原理讲解 问 如题 除了地址不重复外 听说IC 数量只受到总线的最大电容 400pF 限制 那么电容
  • HTTP请求响应系列02_响应报文的详解

    响应报文 1 响应报文的详解 上篇文字讲的 请求报文 本篇主要解释响应报文包括的内容 响应报文的内容也包括三部分 分别是 响应行 响应头 响应体 这三部分放的都是信息 是S端发给B端的信息 道理是一样的 响应 就是请求后的结果 栗子 接上篇
  • Http 响应头 Transfer-Encoding : chunked 导致 浏览器客户端请求错误问题

    生产环境服务器规划如下 服务器 类型 网络环境 cal com nginx 外网 192 168 7 15 9200 tomcat 内网 192 168 7 16 9200 tomcat 内网 sdd com nginx 内网 192 16