XMLHttpRequest在Chrome 19中表现不同 - “伪造”请求?

时间:2012-05-17 05:18:15

标签: javascript google-chrome xmlhttprequest

以下是一些示例代码。接着将四个xmlhttprequests()s发送到同一个url。在这种情况下,我希望有四个请求可以通过线路进行,有四个不同的响应,因为在这种情况下,URL会在每次调用时返回一个新的UUID。在Chrome 18,Firefox和Safari中,会发生这种情况。

但是,在Chrome 19中,只有一个请求在线路上,但浏览器的行为就好像返回的所有四个请求都具有相同的值。也就是说,回调执行四次,但每次都有相同的响应文本。开发人员工具和Wireshark都确认实际上只发出了一个请求。

我认为它可能与浏览器缓存行为有关,但是使用客户端(pragma:no-cache)和服务器端(Cache-Control:no-cache)都无济于事。为每个请求添加一个不同的伪查询参数会强制它确实发出所有四个实际请求,但我仍然很好奇改变了什么以及处理它的另一种方式可能是(URL参数除外)。我也怀疑我做了一些奇怪或错误的事情,因为我无法找到其他人谈论这个。

<!doctype HTML>
<script>
  function doOne(i) {
    var xh =  new XMLHttpRequest();
    xh.open("GET", "/uuid", true);
    xh.setRequestHeader("pragma", "no-cache");
    xh.onreadystatechange = function() {
      if (xh.readyState == 4) {
        var p = document.createElement('p');
        p.innerHTML = xh.responseText;
        document.body.appendChild(p);
      }
    }
    xh.send(null);
  }
  window.onload = function() {
    for (var i = 0; i < 4; i++) {
      doOne(i);
    }
  }
</script>

供参考,以下是我用于此测试用例(web.py)的示例服务器的内容:

#!/usr/bin/env python

import uuid
import web

urls = (
  '/uuid', 'Uuid',
)

class Uuid():
  def GET(self):
    web.header('Cache-Control', 'no-cache');
    return str(uuid.uuid1())

app = web.application(urls, globals())

if __name__ == '__main__':
  app.run()

2 个答案:

答案 0 :(得分:0)

我在Rails应用程序中使用Chrome 19时遇到了同样的问题。要修复它,这段代码对我来说很好:

before_filter :set_cache_buster
def set_cache_buster
  if request.xhr?
    response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
  end
end

它禁用每个XMLHttpRequest的缓存。

致谢:http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/

答案 1 :(得分:0)

最近偶然发现了这一点,并没有找到一种强制Chrome不重复使用响应的好方法。 Firefox似乎没有这种行为。

我已经提交了chromium issue并希望有人能说清楚这是预期的行为还是错误。