如何控制ajax请求中的缓存控制

Posted

技术标签:

【中文标题】如何控制ajax请求中的缓存控制【英文标题】:How to control cache-control in ajax request 【发布时间】:2016-01-28 04:32:50 【问题描述】:

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

【问题讨论】:

在ajax中设置cache:false 感谢您的回复,但我希望浏览器使用它的缓存。不希望它获取更新的 json 【参考方案1】:

你可以使用headers属性,像这样:

$.ajax(
...
headers: 
     'Cache-Control': 'max-age=1000' 

...
);

请记住,cache 属性与 Cache-Control 标头没有任何共同之处,它只是一个 cache buster(将 ?_=timestamp 附加到 GET 参数)并且只能在 GETHEAD 请求中正常工作.

无论如何,有用的东西:How to set HTTP headers (for cache-control)?

【讨论】:

谢谢,但是当我更改为相同时,请求显示:缓存控制:无缓存。并且我的请求中没有使用缓存(默认情况下是这样) 是的,我完全按照您的回答做了。还尝试了公共和私有,无论我将其更改为什么,它都会在浏览器控制台中显示无缓存:( 确保您没有在开发者工具中禁用缓存,在 Chrome:网络选项卡上,应取消勾选“禁用缓存”。这是一个常见的错误。 我建议你看看这篇文章并确保标题值的格式正确。 (见更新的答案) 你应该得到正确的答案:) 将添加另一个关于我的 json 问题的问题。谢谢【参考方案2】:

真正的答案是,当您在“网络”面板中看到 Cache-Control: max-age=0 时,这很可能是浏览器为避免缓存所做的事情。 这不是 jQuery 默认做的事情。所以改变标题没有意义。所以你可以简单地使用$.getJSON(),HTTP 缓存就可以工作了……

所以只需在 devtools 中关闭 Disable Cache 功能就可以了(正如 kav 的 cmets 中所述)。

但还有另一个问题。缓存控制标头仅适用于普通 200 请求(成功)。大多数错误不会在 Firefox 中缓存。无论您的服务器说什么,Firefox 都会忽略响应中的缓存控制标头。因此,无论您做什么,Firefox 都不会缓存 404 或 400 请求。您可以使用 410 (Gone) 而不是 404。但这也需要在服务器端完成,而不是在 AJAX 请求中(所以在响应标头中,而不是在请求标头中)。

【讨论】:

以上是关于如何控制ajax请求中的缓存控制的主要内容,如果未能解决你的问题,请参考以下文章

确保控制器方法实际上是由 ajax 或 mvc 中的 POST 请求调用的

如何在laravel 5.2中控制多个ajax请求

如何将 JQuery AJAX 请求中的字符串值传递给 Spring Boot 控制器?

IE浏览器下使用AJAX登陆接口请求缓存与登陆不了的问题解决

如何使用 AJAX 请求将用户在类变量中的 HTML5 位置从 JavaScript 传递到 Rails 控制器?

ajax 请求控制器更新 laravel 中的视图