如何在Sping Boot Web应用程序(2.7.1)或最新版本中禁用传输编码chunked
?
我已经拥有这些属性。
server:
compression:
enabled: true
min-response-size: 1024
mime-types: application/json
我还将Accept-encoding
标头作为gzip
发送。
即使我在响应头中看到了gzip
,我也不认为它真的被压缩了(使用或不使用gzip,响应大小与150 KB相同)。我也不希望传输编码被分块。
更新:我有另一个webflux应用程序,它工作得很好。我没有看到chunked. gzip工作得很好。这与 Postman 无关。
- 当我不发送accept-encoding头时
- 对于同一个请求,当我发送accept-encoding报头
时
1条答案
按热度按时间6pp0gazn1#
您的屏幕截图似乎来自
Postman
,显示的是解压缩后的大小,而不是压缩后的大小。这是
Postman
的屏幕截图,显示了我的支持Gzip
的REST服务Content-Encoding
正在告诉客户端它传输的内容是gzip
压缩的。如果你只是设置这个头而没有压缩响应内容,这可能是不正确的。但是,因为你依赖Spring来做这件事,它很可能是正确的,并且响应是压缩的。Transfer-Encoding
只是表示响应可以分成多个HTTP包发送,这是在服务器事先不知道响应内容大小的情况下进行的。服务器可以通过两种方式知道响应内容的大小。第一种是将序列化的响应缓冲到内存中,然后获取其字节数组长度。第二种是在计算大小时丢弃序列化的内容。在第二个场景中,服务器将不得不序列化响应两次,一次用于查找大小,另一次用于写入ServletOutputStream
。正如您所看到的,这两种提前查找响应大小的方法都是不可取的。服务器将把此Transfer-Encoding
设置为块,即使您响应不是Gzip也是如此这是因为**中JSON序列化Spring的处理方式是,只要缓冲区中有JSON的任何部分可用,就允许将响应写入ServletOutputStream
。这样,服务器可以更快地提供第一个字节。**即使是最小的响应也会发生这种情况。有Transfer-Encoding: chunked
并不意味着您的响应没有被压缩。它意味着Gzip字节一旦可用就被写入ServletOutputStream
或者,您可以使用
CURL
命令查看这两种大小以下是文本形式的命令