这是一些示例代码。依次向同一个 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()