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条)

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)