XMLHttpRequest:如何强制缓存?

10

因为我之前一直使用的是jQuery的AJAX方法,所以对于XMLHttpRequests这方面我比较新手。但是现在我需要在Web Worker中工作,因此出于性能问题,我必须使用传统的XMLHttpRequest。

我正在尝试从jQuery重新构建缓存(cache)属性。如果应该禁用缓存,则添加以下内容:

xhr.setRequestHeader("Cache-Control", "no-cache");

如果我想强制缓存而不是防止缓存,我应该设置哪个头信息?


2
@idbehold - 这会做相反的事情,与被要求的相反。 - Quentin
我也不喜欢这种方法,因为我的路由(例如,如果路由== someroute/)会因时间戳参数而无效。 - user3631654
哦,呵呵!抱歉,不要理我。 - idbehold
如果您真的想强制进行客户端缓存,那么你应该将XHRs(通过模型或库)抽象出来,并在其中实现缓存。 - ssube
1
如果你不想一遍又一遍地获取内容,为什么不存储一个本地副本并使用它呢? - epascarello
显示剩余2条评论
3个回答

7
您可以在请求的Cache-Control头中,指定不带参数的max-stale。 根据RFC 7234

max-stale是一个请求指令,它表示客户端愿意接受超过其新鲜度寿命的响应。 如果给max-stale赋值,则客户端愿意接受其新鲜度已超过指定秒数的响应。 如果没有分配给max-stale任何值,则客户端愿意接受任何年龄的陈旧响应。


5

有许多头部可以设置以鼓励缓存,但它们(包括您错误使用的Cache-Control)是必须由服务器发送而不是请求头部的响应头部。

其中一个使用Cache-Control的示例:

Cache-Control: max-age=3600

这篇面向Web作者和网站管理员的缓存教程更深入地介绍了它们。

并不涉及HTTP层面。你可以将数据复制到本地存储中,然后从那里获取数据,而不是从服务器获取。 - Quentin
好的,那是一个好主意。但还有一个问题:jQuery会不会对缓存执行任何强制操作? - user3631654
但它将具有防止缓存的方法。我不理解为什么最好的做法是附加一个带有时间戳的查询字符串。在许多应用程序(包括我的)中,这将无法正常工作,因为所有路由都不确定是否使用get参数确定路由。 - user3631654
嗯,添加一个随机查询字符串值确实会强制浏览器不读取缓存版本。我不确定你为什么认为它不会起作用。 - epascarello
8
根据RFC 7234Cache-Control可以用作请求头,并支持no-cache - Franklin Yu
显示剩余5条评论

0

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