我用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],就是没有看出来怎么实现的,没看懂。
[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,数据浏览器也接收到了。。。
做一个javascript 对象啊
var content = {
lasttime:time,
html:text
}
将 content 保存到缓存即可!
如果是静态页面,则根据不需要进行干预,系统会自动查找缓存,并根据文件更改时间进行更新。
如果是动态页面,或许有两个方法。
先说我用过的,
并且请求时,增加一个版本标记的参数。如请求a.html时,使用a.html?version=0,系统
也是会默认使用缓存,当文件更新的时候,只要更换version的值就好了,不过这个方法必是在上个页面能被更新的情况下才能继续,通常在首页关联资源文件时使用,如JS文件进行压缩处理后的内容。
还有就是设置Last-Modified,不过没使用过。
[code="java"]response.setRequestHeader("Last-Modified",日期)[/code]
注:不是setRequestHeader("If-Modified-Since",日期)
我知道你的问题所在,你是拿到了这次的报文中的修改时间,但是无法找到上个报文的修改时间。
参考下JQuery.
JQuery的处理方式是在上次请求成功后就将修改时间保存起来,在这次请求成功后进行比较。
不过要多嘴一句,楼上请求html静态页面,应该没有缓存问题的