b0r0j021 2009-10-10 20:00
浏览 329
已采纳

如何获取浏览器缓存里的URL资源的最后修改时间?

我用ajax请求资源 /xxx/a.html的数据

[list]
[*]a.html页面保存了很大量的数据,所以想用缓存,不重新加载。
[*]但a.html又经常被修改,修改后必须重新请求新的数据。
[/list]

所以加上.setRequestHeader("If-Modified-Since",日期)来告诉服务器上次加载过的该文件的时间,使其在修改后重新加载。

[color=red]但是如何通过js获取该资源留在缓存中的上次修改时间是关键!请大虾们指点![/color]
[b]问题补充:[/b]
回1F:
这种处理方式我觉得有点问题,但如果你已经加载过一次a.html,把浏览器关了,再重新访问的时候,就算原资源没有改,但不得不再加载一次,因为浏览器里已经没有那个值了,这个值只有缓存里有(我这个文件挺大的,所以比较吝惜请求次数了)。

回2F:
后面您说的方法:在客户端请求的时候,若认为资源已经修改了,主动在路径后面加(变)参数让服务器得知我请求的是新的资源。我觉得这确实能得到新的数据,但是逻辑上有点问题。(是不是我理解的问题)

客户端在请求的时候,通过js访问远程a.html的时候,是无法知道将要请求的资源对象是否刚修改过了。我怎么能知道什么时候加(变)这样的参数呢。(这个资源是静态资源)。

Last-Modified 是服务器发送HTTP响应的时候组装到包内的。但请求的时候浏览器通常会自动给请求包上打上If-Modified-Since时间戳。但是我测试过程中发现,通过ajax动态请求资源的时候,IE默认使用浏览器缓存,根本就不发数据包,加上 request的If-Modified-Since属性后,会发数据包了,但是这个时间应该设为缓存中最后的修改时间。如何获得不得而知了。

多谢您的积极解答,祝愉快。
[b]问题补充:[/b]
多谢,JQuery有个lastmodified[url],就是没有看出来怎么实现的,没看懂。

  • 写回答

4条回答 默认 最新

  • CaiHuajiang 2009-10-11 08:05
    关注

    [code="java"]多谢,JQuery有个lastmodified[url],就是没有看出来怎么实现的,没看懂。 [/code]
    $.ajax({url:url,ifModified:true,type:post,success...});
    JQuery下有个对象lastModified,初如化为{},设置了ifModified为true后,
    当第一次请求连接时,设置If-Modified-Since为1979-01-01 00:00:00时
    [code="java"]xhr.setRequestHeader("If-Modified-Since",
    jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );[/code]
    当拿到返回结果后,因为通常返回的lastModified总是比If-Modified-Since大,因此
    [code="java"]try {
    modRes = xhr.getResponseHeader("Last-Modified");
    } catch(e) {} // swallow exception thrown by FF if header is not available

                    if ( s.ifModified && modRes )
                        jQuery.lastModified[s.url] = modRes;[/code]
    

    将lastModified中值jQuery.lastModified[url]设置为服务器返回的Last-Modified。
    当下一次请求时,将该jQuery.lastModified[url]值设置为新的If-Modified-Since。
    当返回时,比较下一个页面与当前保存的jQuery.lastModified[url]是否相同,如果相同,就认为可以从缓存中去拿。

    这里有点奇怪的是,如果申请页面是动态页面的话,既然是从缓存中去拿页面,那以后面的服务器响应码是多少,数据浏览器有没有接收呢?
    在FF中测试了下,服务器响应码是200,数据浏览器也接收到了。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?