看起来如果我使用加载动态内容$.get()
,结果会缓存在浏览器中.
在QueryString中添加一些随机字符串似乎解决了这个问题(我使用new Date().toString()
),但这感觉就像一个黑客.
有没有其他方法来实现这一目标?或者,如果唯一的字符串是实现这一目标的唯一方法,除了以外的任何建议new Date()
?
以下将阻止所有未来的AJAX请求被缓存,无论您使用哪种jQuery方法($ .get,$ .ajax等)
$.ajaxSetup({ cache: false });
JQuery的$ .get()将缓存结果.代替
$.get("myurl", myCallback)
你应该使用$ .ajax,这将允许你关闭缓存:
$.ajax({url: "myurl", success: myCallback, cache: false});
我使用new Date().getTime()
,这将避免冲突,除非您在同一毫秒内发生多个请求:
$.get('/getdata?_=' + new Date().getTime(), function(data) { console.log(data); });
编辑:这个答案已有几年了.它仍然有效(因此我没有删除它),但现在有更好/更清洁的方法来实现这一目标.我更喜欢这种方法,但是如果你想在页面的生命周期中为每个请求禁用缓存,这个答案也很有用.
另一种方法是在生成对ajax调用的响应的代码中不提供来自serverside的缓存头:
response.setHeader( "Pragma", "no-cache" ); response.setHeader( "Cache-Control", "no-cache" ); response.setDateHeader( "Expires", 0 );
这里的所有答案都会在请求的URL上留下足迹,该URL将显示在服务器的访问日志中.
我需要一个没有副作用的基于头的解决方案,我发现可以通过在所有浏览器中设置如何控制网页缓存中提到的标题来实现?.
至少为Chrome工作的结果是
$.ajax({
url: url,
headers: {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
});
我个人认为查询字符串方法比尝试在服务器上设置标头更可靠 - 不能保证代理或浏览器不会只是缓存它(某些浏览器比其他浏览器更糟糕 - 没有命名).
我经常使用Math.random()
但是我没有看到使用日期有什么问题(你不应该足够快地执行AJAX请求以获得相同的值两次).
以下文档:http: //api.jquery.com/jquery.ajax/
您可以使用该cache
属性:
$.ajax({ method: "GET", url: "/Home/AddProduct?", data: { param1: value1, param2: value2}, cache: false, success: function (result) { // TODO } });
当然,“缓存破坏”技术可以完成工作,但是如果服务器向客户端指示不应缓存响应,则不会首先发生这种情况。在某些情况下,缓存响应有时是有益的。让服务器决定数据的正确寿命。您可能以后要更改它。从服务器执行操作比从UI代码中的许多不同位置执行操作容易得多。
当然,如果您无法控制服务器,这将无济于事。
使用POST请求而不是GET怎么样?(无论如何你应该...)
真正的问题是为什么你需要这个不被缓存.如果它不应该被缓存,因为它一直在变化,服务器应该指定不缓存资源.如果它有时只是改变(因为它所依赖的资源之一可以改变),并且如果客户端代码有办法知道它,它可以将一个伪参数附加到从某个散列或最后修改日期计算的url这些资源(这就是我们在Microsoft Ajax脚本资源中所做的事情,因此它们可以永久缓存,但新版本仍然可以在它们出现时提供).如果客户端无法知道更改,那么正确的方法应该是服务器正确处理HEAD请求并告诉客户端是否使用缓存版本.对我来说似乎是附加一个随机参数或从客户端告诉从不缓存是错误的,因为可缓存性是服务器资源的属性,因此应该在服务器端决定.问自己的另一个问题是,这个资源是真的应该通过GET服务还是应该通过POST?这是一个语义问题,但它也有安全隐患(有些攻击仅在服务器允许GET时才有效).POST不会被缓存.