网站地图    收藏   

主页 > 前端 > javascript >

ajax get方法产生IE缓存问题解决办法

来源:自学PHP网    时间:2014-09-19 14:47 作者: 阅读:

[导读] ajax get默认情况下一般会产生一些缓存数据了,如果我们要禁止其创建缓存可以加上禁止缓存或在url后面带一个随机参数就可解决ie缓存与ajax缓存问题了。...


昨天遇到一个这样的问题:

IE 浏览器,网站 不能正常登陆和退出。

这就怪异了。之前比较忽略IE。用火狐谷歌测试都是好的。

经过反复排查,终于发现了问题所在。

我使用的是jquery get方法获取

在ie上就产生了缓存,我用ie debug检查工具检查一下 缓存后 数据就更新了。说了也不清楚。。后来我改成post就好了,

还有一个方法就是 get的时候传递一个变量值到服务端。也可以解决此问题。


IE访问策略:Internet选项--浏览历史记录--设置-- Internet 临时文件的选项改为每次访问网页时也可以

1: 在AJAX请求的页面后加个随机函数,我们可以使用随机时间函数

javascript发送的URL后加上t=Math.random()
例如这样:URL+"&"+"t="+Math.random();或者new Date();

 

另:百度到的资料

———————–

昨天在用prototype的ajax到业务逻辑取数据时发现,每次新开启浏览器可正常显示数据库更新后的结果,如果刷新浏览器是不会变化的. 但是删除IE临时文件后再刷新就可以正常显示. 由此,我断定可能是IE会缓存ajax请求返回的数据. 查了一些资料发现普遍反映ajax的get方式会缓存,并且有网友提出了解决办法:

1、在服务端加 header(“Cache-Control: no-cache, must-revalidate”);

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:不推荐

对于以上几点,我还是不满意的,

1的情形,在服务端加,这个问题是ajax搞出来的,应该由它来解决,不管服务端的事;
2和3的情形,我现在用的是prototype,不是普通的ajax原生的语句,所以应该在prototype的前提下解决;
4和5的情形,为什么要在地址后加一个参数?这个参数并不是我的业务逻辑需要的东西(这种方法我还没跑通);
6的情形,改用post,我本来是一个链接就可以搞定的,并且有时必需用链接,却要改成表单,这是不是有点笨了.

对于这个问题的解决,要在prototype的前提下.查阅prototype的文档,可以看到有一个requestHeaders选项,它就是负责处理 请求的头部信息的,上面的方法里也提到在头信息里进行no cache设置,所以我们就把这个选项设置一下就行了.只需在prototype的ajax配置里加一句就行了:

 代码如下 复制代码

requestHeaders: ['Cache-Control','no-cache','If-Modified-Since','0'],

例子:

 代码如下 复制代码

var myAjax = new Ajax.Request(“/Personal/OperatePage.jsp”,
{
method: “get”,
parameters: “action=addfriend&ids=” + escape(ids),
requestHeaders: ['Cache-Control', 'no-cache', 'If-Modified-Since', '0'],
onComplete: function (msg) {
alert(msg.responseText);
}
});

jsp代码

 代码如下 复制代码

public class CachingHeaderInterceptor extends AbstractInterceptor {

 private static final long serialVersionUID = 1L;

 public String intercept(ActionInvocation invocation) throws Exception {
  ActionContext context = invocation.getInvocationContext();
  HttpServletResponse response = (HttpServletResponse) context.get(StrutsStatics.HTTP_RESPONSE);
  if (response != null) {
   response.setHeader("Cache-Control", "no-cache");
   response.setHeader("Pragma", "no-cache");
   response.setHeader("Expires", "-1");
  }
  return invocation.invoke();
 }

}

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论