当xmlhttp-reques时,IE9从缓存(如果可用)而不是服务器加载

时间:2012-02-13 15:19:31

标签: php javascript ajax internet-explorer

我在当地开发。我正在将此代码用于AJAX:

function getChart(num,ld,margin,idr)
{
    idr = typeof(idr) != 'undefined' ? idr : 0;
    $(ld).style.display="inline-block";
    if (window.XMLHttpRequest)
    {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {
        // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            $(ld).style.display="none";
            //to place boxes next to each other
            $("sign_"+num).style.margin=(margin+7)+"px 590px 0 0";
            if(num=="ph"&&$("sign_fx").style.marginTop==$("sign_"+num).style.marginTop&&$("sign_fx").style.marginRight=="590px")
            {
                $("sign_"+num).style.marginRight="605px";
            }
            else if(num=="fx"&&$("sign_ph").style.marginTop==$("sign_"+num).style.marginTop&&$("sign_ph").style.marginRight=="590px")
            {
                $("sign_"+num).style.marginRight="605px";
            }
            else if(num=="fx")
            {
                $("sign_ph").style.marginRight="590px";
            }
            else if(num=="ph")
            {
                $("sign_fx").style.marginRight="590px";
            }
            $("sign_"+num).style.display="block";
            $(num+"_request_ld").style.display="none";
            $(num+"_request_all").style.display="block";
            $(num).style.display="block";
            $(num+"_request").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET","barchart.php?idu=<?php echo $id_signed_in;?>&num="+num+"&idr="+idr,true);
    xmlhttp.send();
}

getChart函数中的参数相同时(意味着getChart已使用相同的参数调用),IE从缓存加载,即使在刷新页面时也不会打扰调用服务器。在删除缓存时,它从服务器获取数据。这是因为我在当地开发吗?

4 个答案:

答案 0 :(得分:1)

  1. 使用jQuery.ajax并设置cache:false,而不是从stratch发出请求。
  2. 在您的回复上设置Expire,该回复由barchar.php
  3. 生成
  4. 使用POST代替GET,它可以解决您的问题,但不建议

答案 1 :(得分:0)

从缓存加载是一项功能,而不是错误。要打败它,请添加缓存清除参数,例如

xxx= <new Date().getTime();>  // note, this is meta-code.

或只是维持一个柜台。在任何情况下,相同的GET URL(包括参数)都将导致返回缓存的值。所以你需要强迫网址不同。

或者使用POST代替GET。

换句话说,HTTP GET调用的基本思想是它们是idempotent。这意味着调用(通过GET)http://server.com?a=1&b=2始终返回相同的答案。既然如此,响应可以(并且应该)被缓存。

因为,显然,你在每次通话中都返回相同的答案,你的网址幂等。从架构的角度来看,这并不好。当您第一次遇到浏览器缓存问题时,您可能还会遇到从客户端到服务器的路径上的多个缓存点的缓存问题。例如缓存代理服务器等

我上面描述的缓存破坏技术(向URL添加更改参数)将起作用。但更好的方法是使用POST请求。

<强>加

HTTP中的

Caching assumptions很复杂。当我说HTTP GET url应该是幂等的时候,我正在简化这些事情。根据HTML正文中的标题值和元标题标记,可以从特定的GET URL更改结果。在默认的简单情况下,浏览器和中间缓存点的假设是GET是幂等的。

由于典型的简单数据响应结果没有明确设置缓存头,因此假设结果可以缓存。因此OP遇到了问题。

答案 2 :(得分:0)

我发现解决这个问题的方法是使用“缓存破坏程序” - 也就是说,将随机生成的数字作为请求的参数附加。此参数的名称不应与服务器期望的任何名称相同,因此它将被忽略,但它会欺骗IE将其识别为新请求。

有关详细信息,请参阅IE Cache and AJAX: Cache Busting Ajax requests

答案 3 :(得分:0)

使用某种随机数据扩展xmlhttp.open,例如barchart.php ....&安培; _cache = RANDVALUE 这样浏览器每次都会重新请求数据。

或者你必须发送阻止即在服务器端缓存的数据