我试图依靠浏览器缓存来保存 从 jQuery 中的 AJAX 调用返回的 JSON 数据。
正常的浏览器事件始终依赖于浏览器缓存。 示例:jpg 和 gif 图像不会在页面重新加载时重新获取。
但是当我尝试使用 jQuery getJSON ajax 调用时,我似乎无法避免从服务器获取数据。
我返回的 header 如下所示(通过 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 header (我选择了一些代表我请求的数据的 URL 参数,并将其用于 Etag 值)
在下一个请求开始时,我只是检查“If-None-Match” header 是否在请求中。如果是这样,那么浏览器就没有像我想要的那样缓存请求,所以我发送了 304 Not Modified 响应。
测试表明 Firefox 不会缓存我的请求 (但我仍然可以避免我的 cgi 的“获取昂贵数据”部分), 而 IE6 实际上会缓存它(甚至不会尝试从服务器取回)。
这不是一个很好的答案,但它现在对我有用
(那些讨厌的整页图形数据刷新现在不会那么慢或昂贵)。
(什么?我正在运行 IE6!天哪!哦,你看是一只松鼠!)
最佳答案
Ajax 缓存是可能的并且是可预测的(至少在 IE 和 Firefox 中)。
这篇博文讨论了 Ajax 缓存并有一个演示网页:
http://blog.httpwatch.com/2009/08/07/ajax-caching-two-important-facts/
还有 Steve Souders 对 F5 问题的跟进:
关于ajax - 浏览器不能只使用之前 ajax 调用的缓存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1230998/