如何在Ajax请求中控制缓存控制

9

这可能是一个愚蠢的问题,但我搜索了很多没有结果。我知道如何在服务器响应中设置缓存控制,但如何在ajax请求中更改缓存控制值呢? 注意:我希望浏览器使用它的缓存。我不想从服务器获取更新的json ... 这就是我想做的全部。

enter image description here


在ajax中设置cache:false - Jai
1
谢谢回复,但我希望浏览器使用它的缓存。不想获取更新后的JSON。 - rramiii
2个回答

18

您可以使用headers属性,方法如下:

$.ajax({
...
headers: {
     'Cache-Control': 'max-age=1000' 
}
...
});

请记住,cache属性与Cache-Control头部没有任何联系,它只是一个缓存破坏器(将 ?_={timestamp} 附加到GET参数),仅在GETHEAD请求中才能正常工作。

无论如何,有一些有用的信息:如何设置HTTP头部(用于缓存控制)?


谢谢,但当我改成相同的请求时,显示:Cache-Control:no-cache。我的请求中没有使用缓存(默认情况下是这样的)。 - rramiii
1
是的,我确实按照你的答案做了。我还尝试过使用public和private,无论我将其更改为什么,浏览器控制台都显示no-cache :( - rramiii
6
请确保您没有在开发者工具中禁用缓存,对于Chrome浏览器来说,应该取消勾选“网络”标签页下的“禁用缓存”选项。这是一个常见的错误。 - Kristian Vitozev
我建议你看一下这篇文章,并确保头部值格式正确。(请参见更新的答案) - Kristian Vitozev
1
你应该得到正确的答案 :) 我将会添加另一个关于我的JSON问题的问题。 谢谢 - rramiii
请注意,标题应该在服务器端添加。这将适用于普通的200请求。即使使用$.getJSON()也是如此。但无论你做什么,Firefox都不会缓存404或400请求。你可以使用410(已删除)代替404。但这也需要在服务器端完成,而不是在AJAX请求中完成。 - Nux

1
当你在网络面板中看到Cache-Control: max-age=0时,这很可能是浏览器为了避免缓存而做的事情。 这不是jQuery默认情况下要做的事情。因此,改变头文件是没有意义的。所以你可以简单地使用$.getJSON(),HTTP缓存将会工作......
所以只需关闭devtools中的禁用缓存功能,你就应该没问题了(如kav的评论中已经提到)。
但还有另一个小技巧。 Cache-control头只对普通的200请求(成功)有效。大多数错误在Firefox中都无法被缓存。无论你的服务器说什么,Firefox都会忽略响应中的Cache-control头。因此,无论你做什么,Firefox都不会缓存404或400请求。你可以使用410(Gone)代替404。但这也需要在服务器端完成,而不是在AJAX请求中(即在响应头中,而不是在请求头中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接