我遇到了ajax缓存的问题,这也是IE浏览器中的一个问题,但我通过编写以下代码修复了它。
response.setHeader("Cache-Control", "no-cache");
response.setHeader("expires","-1");
response.setHeader("pragma","no-cache");
但是我看到MAC上的Safari4.0正在缓存Ajax请求(我们有一个要求支持这个)。火狐永远不会有问题。关于这个“Expire”我将它设置为-1,我看到很多地方设置0或者过去的旧日期。它会有所作为吗?
答案 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 提到的技巧,它实际上被广泛用于强制浏览器加载任何资源的当前版本。