Javascript 强制缓存控制:在F5重新加载时通过XMLHttpRequest在Chrome中没有缓存
我希望确保通过AJAX调用请求的数据是新鲜的,而不是缓存的。因此,我发送头Javascript 强制缓存控制:在F5重新加载时通过XMLHttpRequest在Chrome中没有缓存,javascript,ajax,google-chrome,caching,Javascript,Ajax,Google Chrome,Caching,我希望确保通过AJAX调用请求的数据是新鲜的,而不是缓存的。因此,我发送头缓存控制:无缓存 但是如果用户按F5,我的Chrome版本33将使用缓存控制:max age=0覆盖此标题 例如。将test.html与内容一起放在Web服务器上 <script> var xhr = new XMLHttpRequest; xhr.open('GET', 'test.html'); xhr.setRequestHeader('Cache-Control', 'no-ca
缓存控制:无缓存
但是如果用户按F5,我的Chrome版本33将使用缓存控制:max age=0
覆盖此标题
例如。将test.html
与内容一起放在Web服务器上
<script>
var xhr = new XMLHttpRequest;
xhr.open('GET', 'test.html');
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.send();
</script>
var xhr=新的XMLHttpRequest;
open('GET','test.html');
setRequestHeader('Cache-Control','no-Cache');
xhr.send();
在网络选项卡上的chrome调试器中,我看到test.html AJAX调用。状态代码200。现在按F5重新加载页面。存在最大年龄:0,状态代码304未修改
Firefox也表现出类似的行为。只需覆盖请求头,它就会将其修改为缓存控制:无缓存,F5上的最大年龄=0
我可以不显示吗?另一种方法是在url中附加一个唯一的数字
<script>
var xhr = new XMLHttpRequest;
xhr.open('GET', 'test.html?_=' + new Date().getTime());
//xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.send();
</script>
var xhr=新的XMLHttpRequest;
open('GET','test.html?='+new Date().getTime());
//setRequestHeader('Cache-Control','no-Cache');
xhr.send();
时间戳不是很独特,但它应该对您的用例足够独特。由于多种原因,使用查询字符串进行缓存控制现在不是您的最佳选择,并且(仅)中提到了一些。他甚至解释了版本控制的新标准方法。如果您只是想设置请求头,正确的方法是:
//通过缓存控制头:
setRequestHeader(“缓存控制”,“无缓存,无存储,最大年龄=0”);
//IE和旧浏览器的回退:
xhr.setRequestHeader(“到期”,“1980年1月1日星期二1:00:00 GMT”);
setRequestHeader(“Pragma”,“无缓存”);
希望这对将来的任何人都有帮助。我尝试了(但失败了)对URL进行某种随机化,但没有成功,因为我正在访问的文件(.json)也被缓存
http.setRequestHeader("Cache-Control", "no-cache, no-store, must-revalidate");
我的解决方案是在对json文件名的调用中添加一个时间戳(类似于上面的方法,稍加修改)。这对我来说非常有效(下面的代码片段)
我对这一切都很陌生,所以我确信这不是一个标准/正确的解决方案是有原因的,但它对我有效。这不是真的@wadim所以Chrome和Firefox不尊重RFC2616(现在是7234)?请注意,这个答案是一个社区维基,所以如果你觉得它不能充分回答这个问题,请随时更新它。我没有时间重新访问它。在某些情况下,对于相同API端点的请求,最好使用相同的url。我认为这个答案还不包括那个案例???@chanp正确,它不包括那个案例。这种情况只能通过标题来解决,但ChromeV33覆盖了其中一些标题。。。所以是的,goodluck:)注意:
expires
如果设置了max age
,则不需要expires
<代码>后检查=0和预检查=0
不需要()必须重新验证
不能用于客户端()。它们可能不是必需的,但是有一些较旧的浏览器会忽略一些其他的头,在这种情况下,它们会启动来完成这项工作(我自己用crossbrowsertesting.com对此进行了测试)。虽然我不能保证必须重新验证,因为我对它不太了解,只是因为杀伤力太大而把它扔了进去。另一个解决方案(如果可能的话)是使用“POST”http请求,因为浏览器从不缓存POST请求。
doSomething('files/data.json?nocache=' + (new Date()).getTime(), function(text){...