Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Chrome的POST共用连接问题

  Chrome最让人讨厌的地方就是它总是过度优化程序!其实共用连接是个很好的机制,当两个HTTP请求头完全相同时候,他们会被合并成一次请求,并共享请求返回的数据,这样做可以避免一些不必要的请求数。但是像Chrome这样强制使用就很让人反感。
  有时候即使是完全相同的两个HTTP请求,服务器也未必会返回同样的数据。而且,POST方法通常用于一些对数据库有修改的操作,两次完全相同的HTTP请求,也应该让服务器处理两次。偷懒应该到GET方法上偷,Chrome把这个共用连接的机制用于POST完全是画蛇添足。
  做一个这样的测试就能看出问题 //创建6个XHR对象,并发送异步POST请求(不要吐槽测试代码中的with)
for(var i=0;i<6;i++)
  with(new XMLHttpRequest)
    open("POST","test.php",true),send(),
    onreadystatechange=function(){
      if(readyState<4)return;
      //输出XHR对象的序号和返回的内容
      console.log(this*1+" "+responseText);
    }.bind(i);
  这里的test.php中只有一行代码,输出一个随机数。 echo rand();
  IE和Firefox中都是正常的,而Chrome只发出一个请求而共享数据,所以每个XHR对象得到的东西都一样。如果服务器程序有写入数据库之类的操作,连接被合并之后就会造成写入操作的次数被减少,这很有可能出现服务器和客户端的数据对不上的情况。
  要解决这个问题就像jQuery解决缓存问题一样,直接让每个HTTP请求头都不同,比如在URL中加入一串随机数。这里是POST方法,也可以在POST的参数中加入一个随机数。或者直接在请求头中使用setRequestHeader加入一个随机数。这样就可以骗过Chrome,让它认为这些是不同的请求。
网名:
54.162.218.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^