阻止浏览器cachingjQuery AJAX调用结果

看起来如果我使用$.get()加载dynamic内容,结果被caching在浏览器中。

在QueryString中添加一些随机string似乎解决了这个问题(我使用new Date().toString() ),但这感觉像一个黑客。

有没有其他办法可以做到这一点? 或者,如果唯一的string是唯一的方法来实现这一点,除了new Date()以外的任何build议?

我使用new Date().getTime() ,这将避免冲突,除非你在同一个毫秒内发生多个请求:

 $.get('/getdata?_=' + new Date().getTime(), function(data) { console.log(data); }); 

编辑:这个答案是几岁。 它仍然有效(因此我没有删除它),但现在有更好的/更干净的方法来实现这一点 。 我的首选是这种方法,但如果你想在页面的生命周期中禁用每个请求的caching, 这个答案也是有用的。

以下内容将阻止所有未来的AJAX请求被caching,无论您使用哪种jQuery方法($ .get,$ .ajax等)

 $.ajaxSetup({ cache: false }); 

JQuery的$ .get()会caching结果。 代替

 $.get("myurl", myCallback) 

你应该使用$ .ajax,这将允许你closurescaching:

 $.ajax({url: "myurl", success: myCallback, cache: false}); 

另一种方法是在生成对ajax调用的响应的代码中不提供来自serverside的caching头信息:

 response.setHeader( "Pragma", "no-cache" ); response.setHeader( "Cache-Control", "no-cache" ); response.setDateHeader( "Expires", 0 ); 

您可以使用短符号$.now()而不是每次都执行(new Date()。getTime())。

就我个人而言,我觉得查询string方法比试图在服务器上设置标题更可靠 – 不能保证代理或浏览器无论如何不会caching它(某些浏览器比其他浏览器更糟糕 – 命名没有名字)。

我通常使用Math.random()但是我没有看到使用date的任何错误(你不应该做足够快的AJAX请求来获得相同的值两次)。

所有的答案在这里都留下了所需的URL,它将显示在服务器的访问日志中。

我需要一个基于标题的解决scheme,没有任何副作用,我发现可以通过设置在所有浏览器中控制网页caching中提到的头文件来实现它? 。

结果,至less在Chrome上工作的将是

 $.ajax({ url: url, headers: { 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0' } }); 

以下文档: http : //api.jquery.com/jquery.ajax/

您可以使用cache属性:

 $.ajax({ method: "GET", url: "/Home/AddProduct?", data: { param1: value1, param2: value2}, cache: false, success: function (result) { // TODO } }); 

真正的问题是为什么你需要这个不被caching。 如果它不应该被caching,因为它一直在改变,服务器应该指定不caching资源。 如果它有时会改变(因为它所依赖的资源之一可能会改变),如果客户端代码有一个知道它的方法,它可以将一个虚拟参数附加到从一些散列或最后修改date(这就是我们在Microsoft Ajax脚本资源中所做的,这样可以永久caching这些资源,但新版本仍然可以在出现时提供服务)。 如果客户端不知道更改,正确的方法应该是服务器正确处理HEAD请求,并告诉客户端是否使用caching版本。 在我看来,像追加一个随机参数或者从客户端告诉永不caching是错误的,因为caching能力是服务器资源的属性,所以应该在服务器端决定。 另一个要问自己的问题是,这个资源应该通过GET服务还是应该通过POST? 这是一个语义问题,但它也有安全隐患(只有当服务器允许GET时,才会有攻击)。 POST不会被caching。

当然,“caching中断”技术将完成工作,但是如果服务器向客户端指示不应该caching响应,则这首先不会发生。 在某些情况下,高速caching响应是有益的,有时候不是。 让服务器决定数据的正确使用期限。 你可能想稍后改变它。 在UI代码中,从服务器执行起来要比在许多不同的地方做起来容易得多。

当然,如果你无法控制服务器,这并没有帮助。

如何使用POST请求而不是GET …? (你应该反正…)

也许你应该看看$ .ajax(),而不是(如果你使用jQuery,它看起来像)。 看看: http : //docs.jquery.com/Ajax/jQuery.ajax#options和选项“caching”。

另一种方法是看你如何caching在服务器端的东西。

给出的优秀答案的一小部分:如果您为没有javascript的用户使用非ajax备份解决scheme,则无论如何您都必须获得这些服务器端标头的正确性。 虽然我理解那些放弃的人,但这并非不可能;)

我确定还有另外一个问题,它会给你一整套合适的头文件。 我不完全信服miceus答复涵盖所有的基地100%。

对于那些在移动版Safari中使用$.ajaxSetup() cache选项的$.ajaxSetup() ,看起来您可能必须使用POST的时间戳,因为移动版Safari也caching了这个时间戳。 根据$.ajax() (您从$.ajaxSetup() )指向的文档:

将caching设置为false只能正确使用HEAD和GET请求。 它通过将“_ = {timestamp}”附加到GET参数来工作。 其他types的请求不需要该参数,除了在IE8中对POST已经被GET请求的URL进行POST时。

所以在上面提到的情况下单独设置这个选项不会对你有所帮助。

基本上只是添加cache:false; 在阿贾克斯你认为内容将随着进展而变化。 而那里的内容不会改变的地方可以省略这个。 这样你每次都会得到新的回应

Internet Explorer的Ajaxcaching:你要做什么? 提出了三种方法:

  1. 向查询string添加一个caching清除令牌,如?date = [timestamp]。 在jQuery和YUI中,您可以告诉他们自动执行此操作。
  2. 使用POST而不是GET
  3. 发送一个特别禁止浏览器caching的HTTP响应头

现在,通过在您的ajax请求中启用/禁用caching选项,就可以轻松完成

 $(function () { var url = 'your url goes here'; $('#ajaxButton').click(function (e) { $.ajax({ url: url, data: { test: 'value' }, cache: true, //cache enabled, false to reverse complete: doSomething }); }); }); //ToDo after ajax call finishes function doSomething(data) { console.log(data); } }); 

如果您使用的是IE 9,那么您需要在控制器类定义的前面使用以下内容:

[OutputCache(NoStore = true,Duration = 0,VaryByParam =“*”)]

公共类TestController:控制器

这将阻止浏览器caching。

这个链接的详细信息: http : //dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

其实这解决了我的问题。

正如@Athasach所说,根据jQuery文档, $.ajaxSetup({cache:false})不能用于除GET和HEAD之外的其他请求。

无论如何,你最好从服务器发回Cache-Control: no-cache头。 它提供了一个更清晰的关注点分离。

当然,这不适用于你不属于你的项目的服务网站。 在这种情况下,您可能会考虑从服务器代码代理第三方服务,而不是从客户端代码调用它。

如果使用.net ASP MVC,则通过在终点函数上添加以下属性来禁用控制器操作上的caching:[OutputCacheAttribute(VaryByParam =“*”,Duration = 0,NoStore = true)]

将Math.random()附加到请求url