【问题标题】:Firefox cache key name start with anon&uri=http://xxxxFirefox 缓存键名以 anon&uri=http://xxxx 开头
【发布时间】:2014-02-19 19:53:11
【问题描述】:

我试图通过 XHR 访问 REST 服务器上的资源,因为我想下载它。

 <script type="text/javascript">
     function iframe_onload (){

     var xmlhttp=new XMLHttpRequest();
     var url = "http://example.com/document/12345"

     xmlhttp.open("GET", url, true);
     xmlhttp.setRequestHeader("accept","application/pdf");

     xmlhttp.onload = function() {

     var oIFrm = document.getElementById('myIFrm');
     oIFrm.src = url; 

    };

    xmlhttp.send(null);
   }


<iframe id="myIFrm"  style="visibility:hidden" src="">  
</iframe>

它可以在 Chrome、Safari、IE 上运行,但不能在 FF 上运行,我检查了 FF 中的缓存,来自 XHR 的第一个请求以“anon&uri”开头,所以缓存键类似于“anon&uri=http://example.com/document/12345” ,并且当前页面和url不在同一个域中,我已经为服务器设置了CORS,然后第二个请求无法从缓存中获取PDF文件,如果我将2个服务器放在同一个域下,缓存键是正常的一个没有“anon&uri”的,那么代码就可以工作了。

当我在 FF 上为两个服务器设置 CORS 时,任何人都知道为什么缓存键以“anon&uri=”开头,以及如何避免这个问题并使代码正常工作。

谢谢,

乔伊

【问题讨论】:

    标签: javascript rest firefox caching xmlhttprequest


    【解决方案1】:

    缓存键以“anon&”开头,因为它是一个匿名(不允许 cookie,不允许 http auth)请求,因此不应与对同一 URI 的正常请求缓存在同一缓存条目中。

    在一般情况下,缓存行为正常,但你不能在这里做你想做的事情。

    【讨论】:

      【解决方案2】:

      你可以在url末尾附加时间戳,这样页面就不会被缓存了:

      var now=Date();
      var heartbeat=now.getTime();
      oIFrm.src = url+'?'+heartbeat;
      

      同时将 onload 改为 onreadystatechange:

      xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
          var now=Date();
          var heartbeat=now.getTime();
          var oIFrm = document.getElementById('myIFrm');
          oIFrm.src = url+'?'+heartbeat;
      
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-25
        • 2014-11-17
        • 2012-02-06
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-29
        • 2011-01-28
        相关资源
        最近更新 更多