如何在Safari浏览器中禁用Ajax缓存?

时间:2012-03-30 18:29:18

标签: java javascript ajax caching safari

我遇到了ajax缓存的问题,这也是IE浏览器中的一个问题,但我通过编写以下代码修复了它。

    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("expires","-1");
    response.setHeader("pragma","no-cache");

但是我看到MAC上的Safari4.0正在缓存Ajax请求(我们有一个要求支持这个)。火狐永远不会有问题。关于这个“Expire”我将它设置为-1,我看到很多地方设置0或者过去的旧日期。它会有所作为吗?

3 个答案:

答案 0 :(得分:13)

使用您的GET请求发送一个永远不会相同的额外参数,例如,当前时间戳。类似的东西:

url = url + '&nocache=' + new Date().getTime();

这会阻止缓存。

答案 1 :(得分:3)

首先,关于Expires标题的说明。您的问题未指定您正在使用的服务器框架,因此我不确定这是否适用。但是,您可能会发送无效的Expires标头。

RFC requires Expires to be a date,但您似乎将标题设置为文字"-1"。有许多框架在其HTTP响应对象上有一个expires属性,它接受一个int并自动计算一个从现在起该秒数的日期。

使用HTTP inspector确保您的服务器发送格式有效的日期,而不是-1标题中的Expires


您可以尝试使Cache-Control标题更具限制性:

response.setHeader("Cache-Control", "private, no-cache, no-store, must-revalidate");

must-revalidate告诉缓存他们必须遵守你给他们的任何新鲜度信息。 HTTP允许缓存在特殊条件下提供陈旧的表示;通过指定此标头,您告诉缓存您希望它严格遵循您的规则。 [1]

答案 2 :(得分:1)

根据RFC 2616第9.5节关于POST

   Responses to this method are not cacheable, unless the response
   includes appropriate Cache-Control or Expires header fields. However,
   the 303 (See Other) response can be used to direct the user agent to
   retrieve a cacheable resource.

因此,除非响应另有说明,否则浏览器不得缓存POST响应。同时,浏览器可能缓存GET响应,除非响应另有指定。因此,对于不应缓存的请求,例如AJAX请求,POST是首选方法。

如果您出于任何原因不想将POST用于AJAX,您应该使用 minitech 提到的技巧,它实际上被广泛用于强制浏览器加载任何资源的当前版本。