为何Tomcat+Atmosphere环境下部分HTTP/HTTPS响应随机以1|X开头?
过去一个月收到大量用户反馈,在使用这款Web应用时遇到异常问题。排查所有反馈后发现,所有故障的共同特征是:某条随机请求收到的响应,都以1|X开头。
之前曾遇到过客户因为Tomcat反向代理配置不正确出现同类问题,一开始就建议对方核查全量配置,对方反馈所有配置均正确。当时仍怀疑对方核查有遗漏,又建议检查防火墙。直到4月26日(上周五),在本地工作环境复现了完全相同的问题——本地所有配置完全确认无误,localhost环境下也不存在防火墙规则。
这个问题最反常的地方是,故障响应只会随机追加这三个固定字符,自始至终都是这三个字符。截至目前观测,只有*.js与.html*类型的资源响应会出现这类故障。
对失败的请求重复发起请求、或是刷新页面,就能拿到正常响应。不过刷新页面的操作可能触发另一次随机的请求故障。
下面是加载angular.js时出现该错误的示例:
目前还不清楚问题的根本诱因,也不确定哪些信息对排查有帮助,先列几个已知的环境参数:
- Tomcat 7.x(实际部署版本多为7.0.59或7.0.82)
- Java JDK 8u202
- Atmosphere 2.6.1
如果需要更具体的排查信息,可以随时说明。
补充排查结论:1|X是Atmosphere的HeartbeatInterceptor生成的消息,由paddingBytes字段的默认初始化逻辑产生。
Atmosphere的消息响应遵循固定结构:
- 消息长度
- 分隔符(竖线)
- 实际消息内容
按照这个结构逻辑,Atmosphere有时会生成以字符X为内容的心跳消息,示例如下:
现在的核心待解问题是:为什么这些心跳消息,有时会和其他正常的静态资源响应内容发生合并。
内容的提问来源于stack exchange,提问作者P. Vucinic
相关产品推荐
相关产品推荐

