ie8下tcp长连接带来的问题

crowgns 2011-11-10 04:32:18
背景:
公司一个产品是使用gwt的B/S架构应用,很多页面定时发送ajax请求和服务端交互数据刷新页面,交互的数据都放在body里,响应的状态信息通过http code而是通过响应的body体返回。
最近测试部报在ie8下,停留在有定时刷新的页面,不做任何操作有时会提示有未知错误,几率很低。开发发现前端有两个错误会连续报出,一个是提示没有需要的body,另一个是505 不支持的浏览器并发。用wireshark抓包,tcp内容如下,其中红色是请求:

POST /Console/console/alert_log HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Referer: http://192.168.1.151:8080/Console/Console.html#basicservice/home
Content-Type: text/xml; charset=UTF-8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322)
Host: 192.168.1.151:8080
Content-Length: 177
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: user_id=test; user_name=test; JSESSIONID=97D98075F4F4AACE3E2DC7882671F9D5

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/xml
Content-Length: 170
Date: Wed, 09 Nov 2011 09:28:19 GMT

<status type='Bad Request' code='400' message='没有需要的实体元素'/>POST /Console/console/alert_log HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Referer: http://192.168.1.151:8080/Console/Console.html#basicservice/home
Content-Type: text/xml; charset=UTF-8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322)
Host: 172.16.201.151:8080
Content-Length: 177
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: user_id=test; user_name=test; JSESSIONID=97D98075F4F4AACE3E2DC7882671F9D5

HTTP/1.1 505 HTTP Version Not Supported
Server: Apache-Coyote/1.1
Date: Wed, 09 Nov 2011 09:28:23 GMT
Connection: close

<request><action>get_alert_log_list</action></request>


查了一下http协议,http1.1支持建议一个长连接,也支持一个请求先发包含有expect:100-continue的header,如果响应是100再继续发body。

感觉出现问题的地方是在这个tcp连接里先只发了一个不带expect:100-continue的header,响应直接是找不到body,紧接着发了另一个header,由于使用前一个请求的tcp连接可能导致格式上有问题于是直接505并要关闭该连接。再关闭前接收到之前某个请求的body,tcp连接结束。问题似乎有2个,一个是第一个只发header的请求缺少expect:100-continue,另一个是第二个请求由于和第一个请求共用了同一个tcp连接产生了格式上的问题无法解析。
搜了一下,也没人说ie8有上面的问题,我也觉得ie不太可能对http1.1支持的如此不好。暂时在容器的配置文件里加了maxKeepAliveRequests="1" ,关掉tcp长连接,目前没有再复现以上的问题。
有没有可能是这样,ie用同一个tcp连接发送多个http请求时,先发了一个请求的header,多线程并发在发body前又用该tcp连接发了另一个请求的header,然后才发第一个请求的body,结果就混乱了?
...全文
237 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
crowgns 2011-11-15
  • 打赏
  • 举报
回复
有人回复么?给分了
computer_li 2011-11-11
  • 打赏
  • 举报
回复
我回复了啊,怎么没了,再关注

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧