Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何禁用Ajax缓存?_Java_Javascript_Ajax_Caching_Safari - Fatal编程技术网

Java 如何禁用Ajax缓存?

Java 如何禁用Ajax缓存?,java,javascript,ajax,caching,safari,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请求(我们需要支持这一点)。火狐从来都不是问题。关于这个“Expi

我在ajax缓存方面遇到了一个问题,这在IE浏览器中也是一个问题,但我通过编写以下代码解决了这个问题

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

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

在GET请求中发送一个永远不会相同的额外参数,例如,当前时间戳。比如:

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

这将阻止缓存。

首先,您的
标题上有一条说明将过期。您的问题没有指定您使用的服务器框架,因此我不确定这是否适用。但是,您可能发送了无效的
Expires

但是,您似乎正在将标题设置为文字
“-1”
。有许多框架在其HTTP响应对象上具有expires属性,该属性接受int并自动计算从现在起的秒数

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


您可以尝试使
缓存控件
标题更具限制性:

response.setHeader("Cache-Control", "private, no-cache, no-store, must-revalidate");
必须重新验证
告诉缓存必须遵守您提供给它们的任何新鲜度信息。HTTP允许缓存在特殊条件下为过时的表示提供服务;通过指定此标头,您告诉缓存您希望它严格遵守您的规则

根据第9.5节关于邮政的规定

   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响应。同时,浏览器可能会缓存响应,除非响应另有规定。因此,对于不应该缓存的请求,例如AJAX请求,POST是首选方法


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

尽管这样做可行,这是一个黑客行为——我想知道为什么Safari显然忽略了标题,并且不适当地缓存了内容。@josh3736:我不知道。可能是变量为
response
的事实的一部分,并且可能应该使用
setRequestHeader
request
上设置标题。但这是防止缓存的“行业标准”方法,它比设置标题更简单:)@minitech我们正在设置新的日期().getTime();。我们正在使用我们自己的ajax库,因为我看到我们正在这样做。this.get=函数(queryString){m_requestId=new Date().getTime();m_request.open(“get”,queryString,true);m_request.send(null);返回m_requestId;}@minitech我很难说设置标题是一种黑客行为。设置标头是处理缓存的适当方法-使用日期技巧是因为ajax缓存具有攻击性。我假设
响应。setHeader
调用是服务器代码,我们将在其中设置响应标头。关于headers vs.cache busting参数,您实际上是在倒退:HTTP headers是控制客户端和代理缓存的适当的、RFC指定的位置。破坏缓存的查询字符串参数只是一种常用的技巧,它依赖于副作用而不是标准。