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

这篇具有很好参考价值的文章主要介绍了Http 响应头 Transfer-Encoding : chunked 导致 浏览器客户端请求错误问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 生产环境服务器规划如下
服务器 类型 网络环境
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。

请求的流程图如图所示:

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

  • 问题描述

在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 。这就导致匹配不起来了。文章来源地址https://www.toymoban.com/news/detail-614931.html

到了这里,关于Http 响应头 Transfer-Encoding : chunked 导致 浏览器客户端请求错误问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序之流式(chunked)响应

    使用场景 实时输出场景(GPT) 数据实时要求比较高(商场首页) 微信小程序用法 1、启动块接收(只是适合使用在wx.request接口中) 2、重写块接收函数onChunkReceived 特别注意 接收的Arraybuffer需要转换为字符串进行处理,需要注意中文,详细请查考 往期博文 启动enableChunked之后

    2024年02月10日
    浏览(25)
  • Vue 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案

    前言 顾名思义, chunk-vendors.js 是捆绑所有不是自己的模块,而是来自其他方的模块的捆绑包,它们称为第三方模块或供应商模块。 通常,它意味着(仅和)来自项目 /node_modules 目录的所有模块,会将所有 /node_modules 中的第三方包打包到 chunk-vendors.js 中。 将所有的第三方包集

    2024年02月16日
    浏览(38)
  • uniapp 发布h5前端项目时因chunk-vendors过大导致首屏加载太慢以及跳转外部链接

    安装插件 compression-webpack-plugin 安装webpack 新建web.config.js

    2024年02月11日
    浏览(28)
  • maven编译failed to transfer from http://0.0.0.0/ during a previous attempt.

    报错如上,核心报错是:“failed to transfer from http://0.0.0.0/ during a previous attempt.”。 经过检查,发现https://maven.aliyun.com/nexus/content/groups/public/ 是https头,而setting.xml配置文件中写的是http。

    2024年02月12日
    浏览(28)
  • win11 系统暂无可用音频设备导致播放失败/音频服务未响应

    win11再一次更新后音频突然用不了了,驱动和输出设备都显示正常,但每次播放就会出现下面的问题,重启和更新驱动也没用。最后百度了好久终于解决了。 最后发现可能是新的驱动和电脑不兼容,重装回原来的驱动即可。 1.按下键盘win+x,打开设备管理器,展开’声音、视频

    2024年02月11日
    浏览(34)
  • PyQt5 执行耗时操作导致界面卡死或未响应的解决办法

    当用PyQt5开发一个GUI界面 ,需要执行业务逻辑时,后台逻辑执行时间长,界面就容易出现卡死、未响应等问题。 在PyQt中,GUI界面本身就是一个处理事件循环的主线程,当进行耗时操作时,主线程GUI需要等待操作完成后才会响应,在等待这段时间,整个GUI就处于卡死的状态。

    2024年02月09日
    浏览(31)
  • vue3使用响应式数据 + v-model导致响应式失效el-form表单无法输入的问题

    参考文章 重构vue2项目时发现的问题,原始项目使用的是 Element-ui 。 其实vue3可以使用适配的 Element-plus 问题描述 el-form表单无法输入 控制台报错 Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfront in the data option. 使用响应式变量时应先声明 解决办法

    2024年02月15日
    浏览(31)
  • Http---HTTP响应报文

    1. HTTP响应报文分析 HTTP 响应报文效果图: 响应报文说明: 原始响应报文说明: 说明: 每项数据之间使用: rn 2. HTTP 状态码介绍 HTTP 状态码是 用于表示web服务器响应状态的3位数字代码 。 状态码 说明 200 请求成功 307 重定向 400 错误的请求,请求地址或者参数有误 404 请求资源在服

    2024年03月10日
    浏览(42)
  • HTTP常见响应码以及响应码代表的内容

    很有意思的一个段子 : 消息: 描述: 100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。 101 Switching Protocols 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。 消息: 描述: 200 OK 请求成功(其后是对GET和P

    2024年02月07日
    浏览(32)
  • HTTP工具类封装与http请求响应

    一、前言 在Java web系统中经常需要与外部接口进行对接,比较多的方式就是是http的方式。在springboot中,我们可以直接使用封装的feign如:我们去请求微信的接口,定义一个client客户端,使用feign框架去请求就可以。但是也有很多系统没有使用feign的框架,那就需要使用http工具

    2024年04月25日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包