我试图依靠浏览器缓存来保存 从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 UPDATE --x - x - x -
令我失望的是,有几位受人尊敬的人都认为这不仅是可能的。 有些人甚至认为它不应该(这仍然让我困惑)。
Stubburn故障,我尝试了以下几点:
我在要缓存的所有传出页面上设置了Etag标头 (我选择一些选择URL参数来表示我正在请求的数据,并将其用于Etag值)
在下一个请求开始时,我只是检查请求中是否有'If-None-Match'标头。如果是这样,那么浏览器不会像我想要的那样缓存请求,所以我发送了304 Not Modified响应。
测试显示Firefox不会缓存我的请求 (但我仍然可以避免'获取昂贵的数据'部分我的cgi), 而IE6实际上会缓存它(甚至不会尝试从服务器取回)。
这不是一个很好的答案,但它现在对我有用 (图形数据的那些完整的页面刷新现在不会那么慢或昂贵。)
(什么?我正在运行IE6!天啊!哦,看起来像一只松鼠!)
答案 0 :(得分:13)
Ajax缓存是可行且可预测的(至少在IE和Firefox中)。
此博客文章讨论了Ajax缓存并有一个演示网页:
http://blog.httpwatch.com/2009/08/07/ajax-caching-two-important-facts/
史蒂夫·索德斯还对F5问题进行了跟进:
答案 1 :(得分:1)
简短的回答是否定的。遗憾的是,浏览器无法以与“普通”页面相同的方式可靠地缓存AJAX请求。 (虽然数据实际上可能被高速缓存,但是当您按照预期的方式处理AJAX请求时,浏览器通常不会使用缓存。)这应该会在未来发生变化,但现在你必须解决它。
答案 2 :(得分:1)
您可能需要使用Resource Expert Droid检查资源,以确保他们按照您的意图行事。您还应该运行网络跟踪以使用类似Wireshark之类的内容仔细检查请求和响应标头,以防Firebug没有说明完整的故事。
jQuery可能会以浏览器决定绕过缓存的方式包含一些请求标头。您是否尝试过没有框架的普通XMLHTTPRequest
?
答案 3 :(得分:0)
虽然不是“浏览器缓存”会话状态或其他形式的客户端保存。您仍然需要查看评论中提到的if modified modified情况。
由于json确实动态检索并且缓存中的内容是静态的,因此浏览器本身不会知道数据是否已更改。我想?
答案 4 :(得分:0)
在作者声称ajax浏览器缓存确实可靠之后,在此处找到了相关链接。