Tomcat 9 HTTP/2环境下图片随机损坏问题排查求助
解决Tomcat 9 HTTP/2下图片随机损坏+ERR_SPDY_PROTOCOL_ERROR问题
我之前也踩过这个Tomcat 9的HTTP/2坑!结合你给出的错误日志和浏览器提示,这个问题的根源很明确:Tomcat 9早期版本的HPack Huffman编码实现存在bug,无法处理码点超出0-255的Unicode字符(比如你日志里的Č,码点268)。当响应头里包含这类字符时,Tomcat会抛出IllegalArgumentException,直接导致HTTP/2连接中断,浏览器就会报ERR_SPDY_PROTOCOL_ERROR(HTTP/2的前身是SPDY,所以浏览器会沿用这个错误码),图片加载失败就是连接中断的连锁反应,随机性是因为只有带特殊字符响应头的请求才会触发这个问题。
下面给你几个可行的解决方案,按优先级排序:
- 优先升级Tomcat版本:这个bug在Tomcat 9.0.30及后续版本已经被官方修复了。直接升级到最新的稳定版9.x分支,就能彻底解决这个问题,这是最省心的方案。
- 临时禁用HPack Huffman编码:如果暂时没法升级,可以修改Tomcat的
server.xml配置,在HTTP/2的升级协议里关闭Huffman压缩。具体配置示例:
关闭后虽然会损失一点压缩效率,但能立刻避免这个异常。<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" huffmanCompression="false"/> </Connector> - 清理响应头中的非ASCII字符:检查你的应用有没有返回包含非ASCII字符的自定义响应头(比如
X-*开头的自定义头),把这些字符转成URL编码(比如Č转成%C4%8C)或者替换成ASCII兼容的字符,也能绕过这个问题。
内容的提问来源于stack exchange,提问作者Jan Pfeifer
相关产品推荐
相关产品推荐

