我有一个XMLHttpRequest
做一个GET请求:
const xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", "myapi/getThing", true)
通常,响应保持不变,所以服务器指示用HTTP响应头缓存它:
Cache-Control: public, max-age=604800, immutable
然而,现在我执行一个我知道会改变响应的动作,所以我再次调用XMLHttpRequest
,但结果不会因为缓存而改变。
我如何使这个资源的下一个XHR调用不会使用浏览器缓存?
我已经尝试将Cache-Control
设置为no-cache
的请求:
xmlHttp.setRequestHeader("Cache-Control", "no-cache, no-store, max-age=0")
但是浏览器仍然使用缓存
目标是显式地不更改服务器设置的缓存策略,因为性能原因,所以没有验证之类的。这应该纯粹是客户端想要一个'新鲜资源'的需求。
一个有效的解决方案:
通过参数破坏缓存
假设服务器支持添加无用的参数
我认为这两种选择都可以工作,正如@Fudge Fudge建议的那样,缓存破坏是最常用的一种,例如:
xhtp.open("YOUR_METHOD","your_url?" + (Math.random() * 1e16).toString(16))
或者你可以使用Date.now()
等,这取决于你,足够的随机数来保证唯一性就足够了。
另一种方法是:
xhtp.setRequestHeader("Cache-Control","no-cache, no-store, must-revalidate");
xhtp.setRequestHeader("Pragma","no-cache");
xhtp.setRequestHeader("Expires","0");
有时像Expires
这样的旧头文件可以完成工作。