zoukankan      html  css  js  c++  java
  • ajax清除缓存的问题

    在使用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() 

     //获取接受返回信息层 
     var msg = document.getElementById("msg"); 
     //获取表单对象和用户信息值 
     var f = document.user_info; 
     var userName = f.user_name.value; 
     var userAge = f.user_age.value; 
     var userSex = f.user_sex.value; 
     //接收表单的URL地址 
     var url = "/save_info.php"; 
     //需要POST的值,把每个变量都通过&来联接 
     var postStr = "user_name="+ userName +"&user_age="+ userAge +"&user_sex="+ userSex; 
     //实例化Ajax 
     var ajax = InitAjax(); 
      
     //通过Post方式打开连接 
     ajax.open("POST", url, true); 
     //定义传输的文件HTTP头信息 
     ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
     //发送POST数据 
     ajax.send(postStr); 
     //获取执行状态 
     ajax.onreadystatechange = function() { 
      //如果执行状态成功,那么就把返回信息写到指定的层里 
      if (ajax.readyState == 4 && ajax.status == 200) { 
       msg.innerHTML = ajax.responseText; 
      } 
     } 
    }

    在要异步获取的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");
    response.addHeader("Expires", "Thu, 01 Jan 1970 00:00:01 GMT");


    html实现方法

     代码如下 复制代码


    <META HTTP-EQUIV="pragma" CONTENT="no-cache"> 
    <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> 
    <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">

  • 相关阅读:
    Div高度百分比
    字典树模板题 POJ 2503
    POJ 2828
    POJ 2186
    HDU 3397 双lazy标记的问题
    HDU 3911 区间合并求最大长度的问题
    CodeForces 444C 节点更新求变化值的和
    POJ 3667 线段树的区间合并简单问题
    HDU 4578 线段树复杂题
    UVAlive 3211 Now or Later
  • 原文地址:https://www.cnblogs.com/lin-dong/p/6561270.html
Copyright © 2011-2022 走看看