Ajax中浏览器缓存导致的问题
问题描述:
当XMLHttpRequest对象利用open方法向服务器发送请求的时候,当一次请求成功以后,页面会把请求到的值存放在页面缓存中,当你第二次发送同样的请求的时候。浏览器不会再去服务器重新取值,而是自动去页面缓存中查找。这样导致浏览器获得的永远是哪个第一次请求时获得的值而无法从浏览器中获得新的值.
例如
cachexmlhttp.open("GET","cache",true);但浏览器第二次请求cache的时候,由于这次请求和上次请求的对象是一样的,而且浏览器缓存中已经保存了上次请求的值,所以就不再去请求cache,而是直接从缓存中获取上次保存的值
解决方法
在每次向服务器发送请求的时候,在url里面拼上一个当前时间的时间戳,这样浏览器就会认为每次请求都不一样,就会去向服务器发送请求了
var url="cache";
//为url添加上时间戳
if(url.indexof("?")>=0){
//如果请求的url原来就有参数
url=url+"&t="+(new Date()).valueOf();
} else{
//如果请求的url原来没有参数
url=url+"?t="+(new Date()).valueOf();
}
cachexmlhttp.open("GET",url,true);
关于中文乱码问题
Ajax中文乱码问题分为两种,一种是服务器端返回数据是中文,一种是页面发送到服务器的数据是中文。
先讨论服务器端返回数据是中文的情况。
对于IE6以上的浏览器,这个问题的解决办法就是XMLHttpRequest对象在页面端定义的Charset和服务器端的http响应头的Content-Type中定义的Charset保持一致就不会有问题。
但是对于IE6,所有的事情就变态起来了。即使按照上面的原则同样解决不了问题。这个时候有两个解决问题的办法
方法1
这个方法很诡异,因为它和前面论述的东西是向矛盾的,在IE6中定义的XMLHttpRequest对象在页面端定义的Charset和服务器端的http响应头的Content-Type中定义的Charset都是GB2312的时候,同样会出现乱码。这个时候,把服务器端的http响应头的Content-Type中定义的Charset设置成utf-8就可以解决问题。
方法2
这个是推荐的方法,在IE6中定义XMLHttpRequest对象的时候,只使用MSXML2.XMLHTTP和Miscrosoft.XMLHTTP两个版本的Activex控件来创建就
可以解决这个问题,下面是代码
这是微软推荐的做法。所以通常就这么用了
var activexName = ["MSXML2.XMLHTTP","Miscrosoft.XMLHTTP"];
for (var i = 0; i <activexName.length; i++) {
try{
xmlhttp = new ActiveXObject(activexName);
break;
} catch(e) {
}
}
对于页面端发送到服务器中文导致的乱码问题
当页面段和服务器端使用的编码方式都是GB2312的时候
解决办法是在页面端获取需要发送的字符串,进行两次编码再传送到服务器,代码如下
var userName = document.getElementById("UserName").value;
//但页面请求参数出现中文,在页面端取得参数后进行两次编码。
//然后在服务器端对编码后的内容进行一次解码,就可以解决这个问题。