Answers:
我使用new Date().getTime()
,这将避免冲突,除非您在同一毫秒内发生多个请求:
$.get('/getdata?_=' + new Date().getTime(), function(data) {
console.log(data);
});
编辑:这个答案已经好几年了。它仍然有效(因此我没有删除它),但是现在有更好/更干净的方法可以实现此目的。我的首选方法是这种方法,但是如果您要在页面生命周期内为每个请求禁用缓存,此答案也很有用。
new Date().getTime()
代码是利用这样的... var nocache = new Date().getTime(); var path = 'http://hostname.domain.tld/api/somejsonapi/?cache=' + nocache;
。我花了几分钟才弄清楚,我自己。当然,?cache
可能是API实际不需要的任何措辞。
无论您使用哪种jQuery方法($ .get,$。ajax等),以下内容都将防止将来所有AJAX请求都被缓存。
$.ajaxSetup({ cache: false });
jQuery的$ .get()将缓存结果。代替
$.get("myurl", myCallback)
您应该使用$ .ajax,这将允许您关闭缓存:
$.ajax({url: "myurl", success: myCallback, cache: false});
此处的所有答案都在请求的URL上留下足迹,该足迹将显示在服务器的访问日志中。
我需要一个没有副作用的基于标头的解决方案,我发现可以通过设置如何在所有浏览器中控制网页缓存中提到的标头来实现。。
结果,至少在Chrome上有效,将是:
$.ajax({
url: url,
headers: {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
});
另一种方法是在生成对ajax调用的响应的代码中不从服务器端提供缓存头:
response.setHeader( "Pragma", "no-cache" );
response.setHeader( "Cache-Control", "no-cache" );
response.setDateHeader( "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
}
});
如何使用POST请求而不是GET ...?(无论如何,您应该...)
真正的问题是,为什么不缓存它?如果不应该因为它一直在更改而对其进行缓存,则服务器应指定不对资源进行缓存。如果它有时只是更改(因为它所依赖的资源之一可能会更改),并且如果客户端代码有一种了解的方式,则可以将伪参数附加到从某个哈希或上次修改日期计算出的url上这些资源(这就是我们在Microsoft Ajax脚本资源中所做的工作,因此可以永久缓存它们,但仍可以按出现的样子提供新版本)。如果客户端不知道更改,则正确的方法应该是服务器正确处理HEAD请求并告诉客户端是否使用缓存的版本。在我看来,像添加随机参数或从客户端告诉永不缓存是错误的,因为可缓存性是服务器资源的属性,因此应在服务器端确定。另一个要问自己的问题是,该资源是应该通过GET真正提供还是应该通过POST提供?这是一个语义问题,但是也有安全隐患(只有在服务器允许GET的情况下,攻击才会起作用)。POST将不会被缓存。
也许您应该改用$ .ajax()(如果您使用的是jQuery,看起来像这样)。看一下:http : //docs.jquery.com/Ajax/jQuery.ajax#options和选项“缓存”。
另一种方法是查看如何在服务器端缓存内容。
基本上,只需添加cache:false;
ajax,您就认为随着进度的进行内容会发生变化。而内容在那里不会改变的地方,您可以忽略这一点。这样,您每次都会获得新的响应
Internet Explorer的Ajax缓存:您将如何处理?建议三种方法:
- 将高速缓存清除令牌添加到查询字符串,例如?date = [timestamp]。在jQuery和YUI中,您可以告诉他们自动执行此操作。
- 使用POST而不是GET
- 发送专门禁止浏览器缓存的HTTP响应标头
现在,通过在ajax请求中启用/禁用缓存选项很容易做到这一点,就像这样
$(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:控制器
这将阻止浏览器进行缓存。
该链接的详细信息:http : //dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/
实际上,这解决了我的问题。
如果使用的是.net ASP MVC,请通过在端点函数上添加以下属性来禁用对控制器操作的缓存:
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]
附加Math.random()
到请求网址
$.now()
而不是每次都使用(new Date()。getTime())。