• 使用iFrame动态加载Application Cache


    为了避免缓存主页面,一般使用动态iFrame的方式来加载Application Cache,方法如下:

     1 updateImageCache: function () {
     2 
     3             if (null == $("iframe")) {
     4                 
     5             } else {
     6                 $("iframe").remove();
     7             }
     8 
     9             var iframe = document.createElement('iframe');
    10             iframe.setAttribute('width', 0);
    11             iframe.setAttribute('height', 0);
    12             iframe.setAttribute('style', "left:0px; top:0px;border:0px; position:absolute;");
    13             
    14             document.body.appendChild(iframe);
    15             iframe.src = 'ImageCache?manifestId=' + this._manifestId;
    16         }

    上面iframe加载的页面是ImageCache,而由于每个用户所需要加载的缓存内容又不相同,所以我这边用manifestId来区分,这是一个唯一值。这样之后Cache是正常加载下来了,可是当我去访问已经缓存的资源的时候,却发现还是从服务器请求,而没有直接从缓存加载。如下图所示:

     

    试了很多方法,搞了好久还是不行,google查了很多资料无果,还在网上发现其他人也遇到过此问题,但是我是见到过这样做成功的例子的,所以还是不死心,比对了http请求的内容,最后终于发现了导致这个原因的罪魁祸首,原来我缓存的资源,在请求的时候Response 中的Cache-Control是private的,如下图:

     

    而如果要从cache直接读取的话,需要把Cache-Control的值修改成public,并且设定max-age的值

    Response.CacheControl = "public";
    Response.Cache.SetMaxAge(new TimeSpan(1, 0, 0));
    Response.Cache.SetNoServerCaching();//关闭服务器输出缓存

    这样就可以正常从Cache中加载数据了

  • 相关阅读:
    struts2学习笔记一struts2标签学习
    Struts2常用标签总结
    Strtus2标签<s:url>
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@d3ade7 ,项目启动错误
    【异常处理】com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@390508 --&nb
    MyEclipse怎么导入导出项目
    struts2的s:iterator 标签 详解
    CSS中的Position属性
    用Iterator实现遍历集合
    ArrayList的toArray
  • 原文地址:https://www.cnblogs.com/Farmer-D/p/4790624.html
Copyright © 2020-2023  润新知