【发布时间】:2015-06-23 23:07:54
【问题描述】:
我有一个向 REST API 发送请求的 JavaScript 应用程序,来自服务器的响应具有缓存标头(如 ETag、缓存控制、过期)。浏览器中的响应缓存是自动的,还是应用必须实现某种机制来保存数据?
【问题讨论】:
-
您可以使用 chrome/firefox 上的网络检查器检查自己。 (剧透:是的;如果标头设置正确,浏览器将缓存 ajax 调用)
我有一个向 REST API 发送请求的 JavaScript 应用程序,来自服务器的响应具有缓存标头(如 ETag、缓存控制、过期)。浏览器中的响应缓存是自动的,还是应用必须实现某种机制来保存数据?
【问题讨论】:
AJAX 请求与普通请求没有什么不同——它是一个 GET/POST/HEAD/浏览器发送的任何请求,并按此方式处理。已确认here:
现代浏览器的 HTTP 和 Cache 子系统比 Ajax 的 XMLHttpRequest 对象低得多。在这个级别,浏览器不知道也不关心 Ajax 请求。它只是遵循基于从服务器返回的响应标头的正常 HTTP 缓存规则。
根据the jQuery documentation,缓存也可以通过至少一种常用方式(附加查询字符串)无效:
缓存(默认:true,对于 dataType 'script' 和 'jsonp' 为 false)
类型:布尔值
如果设置为 false,它将强制浏览器不缓存请求的页面。注意:将缓存设置为 false 仅适用于 HEAD 和 GET 请求。它通过将“_={timestamp}”附加到 GET 参数来工作。其他类型的请求不需要该参数,除非在 IE8 中对已由 GET 请求的 URL 进行 POST。
简而言之,给定相同的标头,AJAX 响应的缓存方式与其他请求相同。
【讨论】:
浏览器自动处理资源缓存。您似乎要问的是服务器的实际响应。
您需要自己在应用程序中进行设置。您可以在前端和后端这样做。
大部分 JS 框架都实现了缓存控制,例如:
jQuery
$.ajaxSetup({
// Disable caching of AJAX responses
cache: false
});
AngularJS
$http.defaults.cache = false;
等等。
在后端这真的取决于你使用什么语言,什么服务器引擎等。
例如检查 Memcached http://memcached.org/
与 Web 开发的任何事情一样,这里和那里都有一些奇怪的事情,例如 某些 IE 版本会自动查询请求,您必须在 url 中添加唯一 id 以防止这种情况发生。
【讨论】:
来自https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started:
注意2:如果你不设置header Cache-Control:no-cache 浏览器会缓存响应并且永远不会重新提交请求,使得调试变得“具有挑战性”。您还可以附加始终不同的附加 GET 参数,例如时间戳或随机数(请参阅绕过缓存)
【讨论】:
浏览器应该自动处理缓存。 检查这篇文章,javascript只有清除缓存方法。 https://developer.chrome.com/extensions/browsingData
【讨论】:
如果服务器发送带有任何缓存头的响应,浏览器应该尊重它。资源或ajax请求之间没有区别。
您还可以在 ajax 调用中指定缓存标头,使其不使用缓存并从服务器获取整个响应。
【讨论】:
由于缓存和过期标头,大多数现代浏览器都支持浏览器缓存
http://www.arlocarreon.com/blog/http/http-requests-and-your-browsers-cache/
There are 2 apects of an HTTP request that can qualify it for being cached:
- Specifc HTTP cache and expire headers
- A unique URL
有趣的阅读:
http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/
【讨论】: