结论:

Content-Length 如果设置了,必须是正确的。如果不设置,浏览器或者其他客户端工具,会自动添加

如果header中存在Transfer-Encoding: chunked,Content-Length将被忽略。

Transfer-Encoding:chunked主要应用在大数据量或动态数据传输上,主要用户服务端响应

今天遇到一个请求一直阻塞,然后提示500,原来以为代码有什么问题,但是在 DispatcherServlet 打了断点,请求一直没有进入,后来发现是Content-Length的值过长导致tomcat层面一直在等待

原理解析

Content-Length头既可以用于客户端发起的请求(request),也可以用于服务器端返回的响应(response)

用于request时,Content-Length表示request body的大小。request body可以简单理解为request header以外的数据,比如表单数据、上传的文件数据。

用于response时,Content-Length表示response body的大小。response body可以简单理解为responset header以外的数据,比如html文本、下载的文件数据。

如果Content-Length比实际长,则服务器会超时,如果比实际短则服务器会截断请求

参考文章

天天见之HTTP Header Content-Length 和 Transfer-Encoding,你真的了解吗? - 知乎

content-length获取的大小与实际文件大小不一致的原因_contentlength和body大小不一致-CSDN博客