JBOSS 7.4 EAP升级后gzip压缩响应体与Content-Length不匹配致截断
问题详情
在IDE中调试时接口响应正常,但响应到达客户端后被截断,仅当nodeData字段为空数组[]时才会出现此问题。通过Servlet过滤器实现Gzip压缩功能,使用br、deflate等其他压缩编码时一切正常,该问题是在将JBOSS升级至7.4 EAP版本后出现的。
响应头信息
Content-Encoding: gzip Content-Length: 78 Content-Type: text/html;charset=UTF-8 Date: Tue, 30 Apr 2024 08:43:47 GMT
实际收到的响应(截断)
{ "status" : "OK" ,"lastModifiedStamp":"1713954485629","no
预期完整响应
{ "status" : "OK" ,"lastModifiedStamp":"1713954485629","nodeData":[]}
可能的解决方法
检查Servlet过滤器的Gzip流处理逻辑
确认压缩完成后是否正确调用GZIPOutputStream的flush()和close()方法,避免缓冲区数据未完全写入响应流。尤其空数组这类小数据场景,容易因缓冲区未满导致数据滞留。同时避免提前设置Content-Length头,压缩后的长度需在压缩完成后才能确定,提前设置会导致客户端因长度不匹配截断数据。适配JBoss内置压缩机制
JBoss EAP 7.4的内置压缩模块可能与自定义Servlet过滤器存在冲突。可以尝试禁用自定义Gzip过滤器,改用JBoss内置配置:在standalone.xml/domain.xml的Undertow子系统中配置压缩参数,比如添加<gzip name="gzipFilter" min-size="10"/>并关联到虚拟主机。修正响应Content-Type
当前响应头Content-Type为text/html,但实际返回的是JSON数据,这可能导致JBoss压缩模块处理异常。确保接口返回时正确设置Content-Type: application/json;charset=UTF-8后再进行Gzip压缩。调整Undertow压缩参数
检查Undertow子系统中关于压缩缓冲区、最小压缩长度的配置,比如降低min-size值,确保空数组这类小数据也能被正确压缩处理。
内容的提问来源于stack exchange,提问作者alphcoder

