关于Ajax学习中的缓存问题


向服务器发送请求

如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:

xmlhttp.open("GET","ajax_info.txt",true);

xmlhttp.send();

在上面的例子中,可能得到的是缓存的结果。

为了避免这种情况,请向 URL 添加一个唯一的 ID:

xmlhttp.open("GET","/try/ajax/demo_get.php?t="+Math.random(),true);

xmlhttp.send();



对于以上代码(代码来源链接 )

给这个url加上一个,Math.random(),url这个参数不就成了:demo_get.asp?t=0.1234567890123456

*! 这为何能正常运行呢?

答(回答来自segmentfault ):

例如你的文件URL是:flie/xxx.txt

第一次Ajax请求这个文件,浏览器可能会将这个文件缓存在本地,下次再打开这个文件浏览器就可以直接打开本地文件,无需重新通过网络再次获取。

但是,浏览器有可能会好心办了坏事,因为你修改了服务器的flie/xxx.txt文件,但是浏览器不知道,它还是会打开本地缓存的文件,这就会造成一些BUG。

为了防止出现这种问题,在URL上加一个参数“t=随机数”,浏览数会认为两次打开的是不同的东西,第二次Ajax就不会使用第一次Ajax的缓存。

至于“这为何能正常运行呢”?

在URL上加上参数,同样还是打开这个文件,当然可以正常运行。

flie/xxx.txt?t=0.1234567890123456,这个URL同样还是打开文件flie/xxx.txt。

而url问号后面的部分叫query string(查询字符串)。如果url对应的是php等实现的动态页面,那么查询字符串可能会被服务器处理。如果是个静态文件,查询字符串对服务器而言通常没啥作用,被服务器忽略,而对浏览器来说却可以防止缓存。

问号后面就是给请求加的一些数据啦。如果服务器没有处理这部分,就当不存在了。但是产生的URL中含有随机数,所以就是唯一的了。也就没有缓存。


但是,

目前网上加随机数来强行刷新缓存的做法是错的!!

HTTP协议中早已有缓存控制方法,详情自己搜HTTP协议之缓存控制 部分!(链接来自博客园)。

你可能感兴趣的:(关于Ajax学习中的缓存问题)