浏览器不能只使用之前的ajax调用缓存吗?

时间:2009-08-05 03:10:13

标签: ajax http caching jquery

我试图依靠浏览器缓存来保存 从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!天啊!哦,看起来像一只松鼠!)

5 个答案:

答案 0 :(得分:13)

Ajax缓存是可行且可预测的(至少在IE和Firefox中)。

此博客文章讨论了Ajax缓存并有一个演示网页:

http://blog.httpwatch.com/2009/08/07/ajax-caching-two-important-facts/

史蒂夫·索德斯还对F5问题进行了跟进:

http://stevesouders.com/tests/ajax_caching.php

答案 1 :(得分:1)

简短的回答是否定的。遗憾的是,浏览器无法以与“普通”页面相同的方式可靠地缓存AJAX请求。 (虽然数据实际上可能高速缓存,但是当您按照预期的方式处理AJAX请求时,浏览器通常不会使用缓存。)这应该会在未来发生变化,但现在你必须解决它。

答案 2 :(得分:1)

您可能需要使用Resource Expert Droid检查资源,以确保他们按照您的意图行事。您还应该运行网络跟踪以使用类似Wireshark之类的内容仔细检查请求和响应标头,以防Firebug没有说明完整的故事。

jQuery可能会以浏览器决定绕过缓存的方式包含一些请求标头。您是否尝试过没有框架的普通XMLHTTPRequest

答案 3 :(得分:0)

虽然不是“浏览器缓存”会话状态或其他形式的客户端保存。您仍然需要查看评论中提到的if modified modified情况。

由于json确实动态检索并且缓存中的内容是静态的,因此浏览器本身不会知道数据是否已更改。我想?

答案 4 :(得分:0)

在作者声称ajax浏览器缓存确实可靠之后,在此处找到了相关链接。

声明在此处找到:http://davidwalsh.name/cache-ajax

链接到此处:http://ajaxref.com/ch6/builtincache.html