在使用AJAX作WEB开发时,往往会存在一些莫名其妙的问题。
如,第一次的AJAX请求是正常的,而第二次为什么就不正常了呢,而且往往会出现于第一次请求同样的结果。
其实这是因为AJAX第一次请求确实是发送到了服务器,而第二次并没有真的发到服务器,而是从IE的缓存中读取的。
那么如何解决这一问题呢?
方法很简单,就是让AJAX请求的URL每一次都不一样就好了。
解决方法如:在AJAX请求的URL后加上随机数:?ram=Math.random()
例:要请求的URL为“ajax.aspx”
那么就改为:“ajax.aspx?ram=” + Math.random();
这样就完全可以避免AJAX从缓存中读取而造成的错误。
第二种清除缓存 :
Response.ExpiresAbsolute = DateTime.Now.AddDays(-1);
Response.Expires=0;
Response.CacheControl="no-cache";
最常用的方法是
方法1:服务器端代码加入
代码如下 | 复制代码 |
response.setHeader("Cache-Control", "no-cache, must-revalidate"); |
方法2:用JavaScript在Ajax提交的时候加入一个随机数作为URL中的一个参数。
代码如下 | 复制代码 |
req.open(url + "&" + Math.random). |
原因:IE中如果XMLHttpRequest提交的URL与历史一样则使用缓存,根本不向服务器端提交。因此无法取到刚提交的数据。
1.在服务端加 header("Cache-Control: no-cache, must-revalidate");(如php中)
2.在ajax发送请求前加上 anyAjaxObj.setRequestHeader("If-Modified-Since","0");
3.在ajax发送请求前加上 anyAjaxObj.setRequestHeader("Cache-Control","no-cache");
4.在 Ajax 的 URL 参数后加上 "?fresh=" + Math.random(); //当然这里参数 fresh 可以任意取了
5.第五种方法和第四种类似,在 URL 参数后加上 "?timestamp=" + new Date().getTime();
6.用POST替代GET:不推荐
加个随机数:
代码如下 | 复制代码 |
xmlHttp.open("GET", "ajax.asp?now=" + new Date().getTime(), true); |
实例
代码如下 | 复制代码 |
function saveUserInfo() |
在要异步获取的asp页面中写一段禁止缓存的代码:
代码如下 | 复制代码 |
Response.Buffer =True Response.ExpiresAbsolute =Now() - 1 Response.Expires=0 Response.CacheControl="no-cache" |
在ajax发送请求前加上xmlHTTP.setRequestHeader("If-Modified-Since","0");可以禁止缓存
代码如下 | 复制代码 |
xmlHTTP.open("get", URL, true); xmlHTTP.onreadystatechange = callHTML; xmlHTTP.setRequestHeader("If-Modified-Since","0"); xmlHTTP.send(); |
AJAX的缓存是由浏览器维持的,对于发向服务器的某个url,ajax仅在第一次请求时与服务器交互信息,之后的请求中,ajax不再向服务器提交请求,而是直接从缓存中提取数据。
有些情况下,我们需要每一次都从服务器得到更新后数据。思路是让每次请求的url都不同,而又不影响正常应用:在url之后加入随机内容。
url=url+"&"+Math.random();
1.每次请求的url都不一样(ajax的缓存便不起作用)
2.不影响正常应用(最基本的)
在JSP中禁止缓存:
代码如下 | 复制代码 |
response.addHeader("Cache-Control", "no-cache"); |
html实现方法
代码如下 | 复制代码 |
|