我正在寻找一种程序化清空浏览器缓存的方法。我这样做是因为该应用程序缓存了机密数据,当您按下“注销”时,我希望删除这些数据。这可以通过服务器或JavaScript实现。当然,在外部/公共计算机上使用软件仍然是不鼓励的,因为还有更多的危险,例如键盘记录器,在软件级别上无法打败它们。
我正在寻找一种程序化清空浏览器缓存的方法。我这样做是因为该应用程序缓存了机密数据,当您按下“注销”时,我希望删除这些数据。这可以通过服务器或JavaScript实现。当然,在外部/公共计算机上使用软件仍然是不鼓励的,因为还有更多的危险,例如键盘记录器,在软件级别上无法打败它们。
Clear-Site-Data
HTTP头,通过该头信息,服务器可以指示客户端Web浏览器清除其域名/子域名的网站缓存,而不考虑之前的Cache-Control
头。中间缓存可能仍然具有缓存数据,并且可能不遵守该头信息。(感谢@nishanthshanmugham)
没有办法让浏览器清除其缓存。如果这是可能的,那将是一个巨大的安全问题。这很容易被滥用——一旦浏览器支持这样的“功能”,我就会立即卸载它。<meta http-equiv='cache-control' content='no-cache'>
<meta http-equiv='expires' content='0'>
<meta http-equiv='pragma' content='no-cache'>
您可能还想考虑关闭表单字段的自动完成功能,尽管我恐怕没有标准方法来实现它( 参见此问题)。
无论如何,我想指出,如果您正在处理敏感数据,应该使用 SSL。如果您没有使用 SSL,任何可以访问网络的人都可以嗅探网络流量,并轻松地看到用户所看到的内容。
使用 SSL 还会使一些浏览器不使用缓存,除非明确告知。请参阅 此问题。
这是可能的,你可以简单地使用jQuery来替换引用缓存状态的“meta标签”为事件处理程序/按钮,然后刷新,很容易。
$('.button').click(function() {
$.ajax({
url: "",
context: document.body,
success: function(s,x){
$('html[manifest=saveappoffline.appcache]').attr('content', '');
$(this).html(s);
}
});
});
注意:此解决方案依赖于作为 HTML 5 规范的一部分实现的应用程序缓存。它还需要服务器配置来设置 App Cache 清单。它不描述通过客户端或服务器端代码清除“传统”浏览器缓存的方法,这几乎是不可能的。
可以使用HTML本身一个小技巧来解决这个问题,即向脚本标签的文件名附加一个参数/字符串,并在文件更新时更改它。
<script src="myfile.js?version=1.0.0"></script>
浏览器将整个字符串都解释为文件路径,即使 "?" 后面是参数。因此,下一次更新文件时,只需更改网站上脚本标签中的数字(例如 <script src="myfile.js?version=1.0.1"></script>
),每个用户的浏览器都会看到文件已经更改,并获取新的副本。
ctime
(或 mtime
),您只需在其后添加该时间即可。例如,在 PHP 中,myfile.js?v=<?=filectime('myfile.js');?>
,这样您就可以为资源创建一个自动更新的缓存。 - Pierre-Antoine Guillaumecaches.keys().then((keyList) => Promise.all(keyList.map((key) => caches.delete(key))))
支持Chrome 40+,Firefox 39+,Opera 27+和Edge浏览器。
Clear-Site-Data: "cache", "cookies", "storage"
fetch()
发送请求,然后执行location.reload()
以获取全新的重启。./chrome --enable-benchmarking --enable-net-benchmarking
chrome.benchmarking.clearCache();
chrome.benchmarking.clearHostResolverCache();
chrome.benchmarking.clearPredictorCache();
chrome.benchmarking.closeConnections();
从上述命令中可以看出,它不仅清除浏览器缓存,还清除DNS缓存并关闭网络连接。当您进行页面加载时间基准测试时,这些功能非常实用。如果只需要清除缓存而不关心DNS缓存和连接,则只需使用clearCache()即可,无需全部使用。
起初,我尝试用各种编程方法在html、JS中清除浏览器缓存,但最新版本的Chrome上都没用。
最终,我使用了.htaccess:
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
已在Chrome、Firefox和Opera中测试
使用location.reload(true);将会强制重新加载当前页面,忽略缓存。
Cache.delete()也可以在新版Chrome、Firefox和Opera中使用。
现在你可以使用Cache.delete()函数。
例如:
let id = "your-cache-id";
// you can find the id by going to
// application>storage>cache storage
// (minus the page url at the end)
// in your chrome developer console
caches.open(id)
.then(cache => cache.keys()
.then(keys => {
for (let key of keys) {
cache.delete(key)
}
}));
适用于Chrome 40+,Firefox 39+,Opera 27+和Edge。