【问题标题】:How can we deal with "checking for new versions of a page"?我们如何处理“检查页面的新版本”?
【发布时间】:2011-12-24 19:03:55
【问题描述】:

我有一个网络应用程序。使用 AJAX(通过 jQuery)。我注意到一些用户进行了更新,应该通过$.get 在网页上自动更新,但在某些情况下没有更新发生。我将问题缩小到任一

A.  A race condition
or 
B.  Caching

我无法在我的浏览器 IE7 和 FF7 上重现该问题。我去了用户的机器,让他们在 IE7 中检查the setting 以“检查页面的新版本:每次访问”。问题似乎消失了。所以,我相信问题出在这个设置上,最初设置为“自动”。

其他浏览器是否支持这种“缓存”(或者在技术上是这样翻译的)?

知道为什么 IE7 不够智能,无法在代码显式进行服务器调用时让 AJAX $.get() 请求被缓存吗?我的意思是,是否存在已知错误或者这是一个“功能”?

可以在不翻转客户端设置的情况下禁用它吗?

【问题讨论】:

  • @psr - 这个问题专门针对 HTTP。我不知道如何将该解决方案转换为适用于 jQuery 的解决方案。我也不确定该解决方案是否适用于这种情况。但是,这让我想知道这个问题是否真的属于 SO。
  • @psr - 这看起来是我的第三个问题的一个很好的解决方案。您知道浏览器设置与问题的关系吗?我是否可以假设按照所述更改设置提供了替代解决方案?
  • @psr Stack Overflow 问题肯定是相关的,但我们不能在这里迁移。这显然是题外话。
  • 我认为这个问题在 SO 上也可以做得很好。它部分是概念性的,但核心似乎仍然是一个实现问题。你想让我把它迁移过来吗?
  • @Anna Lear - 当然。我认为这是个好主意,谢谢。

标签: jquery http caching


【解决方案1】:

如果查询字符串与您的$.get() 相同,则它是相同的 URL,浏览器将返回缓存,这是理所当然的。如果您想确保它始终获得新副本,请将带有时间戳的虚假查询字符串参数附加到 $.get() 中的 URL。

【讨论】:

  • 这是一个有趣的想法。我希望不必在我的整个应用程序中这样做。我没有看到 GET 请求背后的逻辑对缓存有效,因为 URL 没有更改。查询参数允许强大的查找,这排除了 READ 操作可能随时间(或者更确切地说是定义的时间段)发生变化的可能性。
  • 除了添加随机查询字符串参数以防止缓存之外,您还可以查看添加Cache-Control 标头。 w3.org/Protocols/rfc2616/rfc2616-sec14.html
【解决方案2】:

我想我应该从 cmets 转到答案。

this stack overflow question 介绍了让 JQuery 为您禁用缓存的方法。

是的其他浏览器缓存,我不知道任何不支持缓存的常见浏览器。不过,用户对此设置偏好的方式存在一些差异。

我认为缓存应该被视为一项功能,因为它只是发出一个获取请求,尽管老实说我不知道​​标准是否解决了这种行为。

如果不翻转客户端设置就无法禁用它,但最简单的解决方法是确保它不会两次看到相同的 URL,因此它不可能缓存它。如果您将缓存参数设置为 false,这实际上是 JQuery 在内部所做的。

您可以通过标头控制缓存,但我认为并非所有浏览器都正确支持此功能。我相信现在从不重复 URL 是唯一可靠的跨浏览器解决方案。

【讨论】:

  • 哪个浏览器不理解 Cache-Control?总是请求唯一的 URI 会浪费浏览器缓存中的空间。
  • @DaveMooney 我认为一些旧浏览器忽略了它,但即使是那些尊重 Pragma nocache 标头的浏览器。当我需要确保没有缓存发生时,我总是出于习惯添加两者。
  • 我不知道哪些浏览器会响应哪些标题,但出于某种原因,JQuery 仍然通过附加时间戳来实现将缓存设置为 false,而且它肯定是一个经过大量审查的库。我猜可能只是向后兼容。见cache参数下的api.jquery.com/jQuery.ajax
  • @psr 时间戳技术还可以避开浏览器和 Web 服务器之间的任何代理缓存。我可以看到好处。
【解决方案3】:

您可以将 Cache-Control HTTP 标头设置为 no-cache。这将导致浏览器始终向服务器发出请求。 IE 和其他所有浏览器都像对待任何其他请求一样处理源自 javascript 的 HTTP 请求。

【讨论】:

  • 如果我记得很久以前,有特定的浏览器不尊重这个标题,但我认为这可能不再是这种情况了。我想不出任何仍然忽略 Cache-Control
猜你喜欢
  • 2019-05-13
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多