3

这是一些示例代码。依次向同一个 url 发出四个 xmlhttprequests()。在这种情况下,我希望有四个请求通过网络进行,有四个不同的响应,因为在这种情况下,URL 在每次调用时都会返回一个新的 UUID。在 Chrome 18、Firefox 和 Safari 中,会发生这种情况。

然而,在 Chrome 19 中,只有一个请求通过网络传输,但浏览器的行为就好像所有四个请求都返回了相同的值。也就是说,回调执行了四次,但每次都使用相同的响应文本。开发者工具和 Wireshark 都确认实际上只发出了一个请求。

我认为这可能与浏览器缓存行为有关,但同时使用客户端(编译指示:无缓存)和服务器端(缓存控制:无缓存)并没有帮助。为每个请求添加一个不同的虚假查询参数确实会强制它发出所有四个实际请求,但我仍然很好奇发生了什么变化以及处理它的另一种方法可能是什么(除了 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()
4

2 回答 2

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/

于 2012-05-25T06:11:03.127 回答
0

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

我已经提交了一个铬问题,希望有人能说明这是预期的行为还是错误。

于 2014-01-13T10:53:55.970 回答