【问题标题】:Forcing AJAX request to revalidate cache with server, without reloading completely强制 AJAX 请求与服务器重新验证缓存,而不完全重新加载
【发布时间】:2013-06-25 22:59:04
【问题描述】:

我有一个 Web 应用程序可以让浏览器长时间缓存 AJAX 请求结果。当检测到可能的修改时,我发现了如何发出完全绕过缓存的请求。但我想让用户触发数据刷新。

在这种情况下,我希望浏览器与服务器检查缓存是否停止但如果不是则使用它(即,如果服务器以 304 代码响应) .目标是节省加载时间,因为数据量很大。

服务器在所有响应中包含以下标头:

Cache-Control: private, max-age=604800
Last-Modified: ... # actual last modification date

通过在请求中使用以下 HTTP 标头,我设法在 Chrome(尚未测试其他浏览器)中完全爆破缓存的对象:

Cache-Control: max-age=0
If-Last-Modified: Tue, 01 Jan 1970 01:00:00 +0100

If-Last-Modified 行是真正有效的行。 Chrome 似乎忽略了请求中的 Cache-Control 标头。

我还发现,在服务器响应中使用Cache-Control: must-revalidate 会强制浏览器针对每个 请求向服务器验证其缓存。

但是有没有办法重新验证一个精确的请求,由客户端决定

请注意,我并不特别喜欢使用 HTTP 标头执行此操作,因此欢迎使用我不知道的任何其他方法!

【问题讨论】:

  • 所以只需使用If-Last-Modified 和最后一个Last-Modified 响应头。
  • 我试过了,我确实从服务器得到了304,但是浏览器没有使用缓存来填充响应,所以它在代码中是空的......我假设浏览器对它自己未添加的 If-Last-Modified 标头不感兴趣。
  • 那么,假设您自己缓存最后一个响应,您必须手动执行此操作,即如果响应为 200,则覆盖您的缓存,如果响应为 304,则使用旧副本。它可以很容易地抽象出来。

标签: javascript ajax http browser-cache cache-control


【解决方案1】:

您可以添加一个 url 参数,该参数的值基于时间来为一个精确的请求清理缓存。

$.ajax({
    url:"/questions?nocache="+Date.now(),
    "success":function(data){
         console.log(data);
    }
});

【讨论】:

  • 我不想完全绕过缓存,我希望浏览器询问服务器它的缓存是否仍然有效,如果收到 304 就使用它。只有在以下情况下才应该丢弃缓存服务器回答 200。
猜你喜欢
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多