Javascript XMLHttpRequest在Chrome19--'中的表现不同;伪造';请求?
下面是一些示例代码。依次对同一url创建四个xmlhttprequests()。在本例中,我希望有四个请求通过网络发送,并有四个不同的响应,因为在本例中,URL在每次调用时都返回一个新的UUID。在Chrome18、Firefox和Safari中,情况就是这样 然而,在Chrome19中,只有一个请求在网络上传输,但浏览器的行为就像所有四个请求都返回相同的值一样。也就是说,回调执行四次,但每次都使用相同的响应文本。开发者工具和Wireshark都确认只提出了一个请求 我认为这可能与浏览器缓存行为有关,但同时使用客户端(pragma:no-cache)和服务器端(cache-Control:no-cache)并没有帮助。为每个请求添加一个不同的伪查询参数确实会迫使它生成所有四个实际请求,但我仍然很好奇会发生什么变化以及处理它的其他方式(URL参数除外)。我也怀疑我做了一些奇怪或错误的事情,因为我找不到其他人谈论这件事Javascript XMLHttpRequest在Chrome19--'中的表现不同;伪造';请求?,javascript,google-chrome,xmlhttprequest,Javascript,Google Chrome,Xmlhttprequest,下面是一些示例代码。依次对同一url创建四个xmlhttprequests()。在本例中,我希望有四个请求通过网络发送,并有四个不同的响应,因为在本例中,URL在每次调用时都返回一个新的UUID。在Chrome18、Firefox和Safari中,情况就是这样 然而,在Chrome19中,只有一个请求在网络上传输,但浏览器的行为就像所有四个请求都返回相同的值一样。也就是说,回调执行四次,但每次都使用相同的响应文本。开发者工具和Wireshark都确认只提出了一个请求 我认为这可能与浏览器缓存行为
<!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>
我在Rails应用程序中使用Chrome19也看到了同样的问题。要解决此问题,此代码对我来说很好:
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禁用缓存
信用证:最近也偶然发现了这一点,并且还没有找到一个好的方法来强迫Chrome不重用响应。Firefox似乎没有这种行为
我已经提交了一份申请,希望有人能澄清这是故意的行为还是错误。尝试发送所有下一个响应(服务器)标题“无缓存”<代码>缓存控制:无缓存,
日期:GMT当前时间此处
(例如,日期:2012年5月17日星期四05:44:24 GMT),过期:-1
,Pragma:无缓存
@AndrewD。谢谢你的评论;pragma:no cache用于请求,而不是响应,在示例代码中,我在请求上设置它。对于缓存控制,我也尝试了无存储,但没有任何帮助。pragma
可用于请求和响应。您也可以简单地检查它:在谷歌上找到一些东西,然后在网络选项卡上检查FF firebug或Chrome开发工具。使用缓存控制:无缓存
查找响应。在所有带有缓存控制:无缓存的响应中,您也可以看到Pragma:no Cache
。@AndrewD。当然,像谷歌这样希望处理各种古怪和/或古老客户的网站可能会设置它,但RFC很清楚,它是用于请求的。在我的例子中,我的问题是针对谷歌自己开发的一款非常现代的浏览器的旧版本,因此假设它理解缓存控制,而不是完全依赖于对Pragma的旧的误解,这是非常合理的。不管怎样,只是为了让你开心,我试过了;它没有效果:)再次感谢您的评论。请点击这里的评论系统。为上面的混乱道歉。主要的一点是,我尝试了你的标题集,确认它们按预期安装在电线上,但它们对我不起作用。问题在Chrome 34中部分修复,在Chrome 35中完全修复。不幸的是,安卓4.4的网络视图是Chrome33,仍然存在这个问题。对Chrome浏览器应用程序的更新也不会更新嵌入WebView GUI组件的其他应用程序所使用的副本,因此这些应用程序会被固定在Chrome 33上。这将影响到仍然支持Android 4的Android开发人员,因此建议在Android.os.Build.VERSION.SDK
为19(或可能低于19;我不知道是否有人检查了Chrome的第一个版本出现此问题)时,不时调用browser.clearCache()。
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