我试图依靠浏览器缓存来保存从jQuery中的AJAX调用返回的JSON数据。
正常的浏览器活动始终依赖于浏览器缓存。示例:重新加载页面时未重新获取jpg和gif图像。
但是,当我尝试使用jQuery getJSON ajax调用时,似乎无法避免从服务器获取数据。
我返回的标头如下所示(已通过Firebug确认):
Transfer-Encoding: chunked Date: Wed, 05 Aug 2009 02:55:39 GMT Content-Type: text/plain; charset=ISO-8859-1 Expires: Wed, 05 Aug 2009 03:55:39 GMT Cache-Control: max-age=3600
但是,页面的立即刷新会导致相同的请求到达服务器。
我看过几篇关于避免缓存行为的文章,这不是我所需要的。我看过几篇有关使用缓存的文章,但是这些似乎都依赖于将数据保存在DOM中。我想要的行为就像页面重新加载期间缓存的图像一样。
难道浏览器只是从它自己的缓存中获取它?
--x–x–x–x更新–x–x–x–
令我非常失望的是,几个受人尊敬的人都认为这不仅是可能的。有人甚至辩称不应该这样(这仍然让我感到困惑)。
存根错误,我尝试了以下方法:
我在要缓存的所有传出页面上设置了Etag标头(我选择了一些表示我请求的数据的选择URL参数,并将其用作Etag值)
在下一个请求的开头,我只是检查请求中是否包含“ If-None-Match”标头。如果是这样,那么浏览器就不会像我想要的那样缓存请求,因此我发送了304 Not Modified响应。
测试表明,Firefox不会缓存我的请求(但是我仍然可以避免cgi的“获取昂贵的数据”部分),而IE6会实际缓存它(甚至不会尝试从服务器取回)。
这不是一个很好的答案,但它目前对我 有用(那些充满麻烦的图形数据全页刷新现在不会太慢或太昂贵了)。
(什么?我正在运行IE6!OMG!哦,看起来是一只松鼠!)
Ajax缓存是可能且可预测的(至少在IE和Firefox中)。
这篇博客文章讨论了Ajax缓存,并有一个演示网页:
http://blog.httpwatch.com/2009/08/07/ajax-caching-two-important- facts/
史蒂夫·苏德斯(Steve Souders)也就F5问题进行了跟进:
http://stevesouders.com/tests/ajax_caching.php