如何以编程方式清空浏览器缓存?

IT技术 javascript html caching browser
2021-02-03 23:57:07

我正在寻找一种以编程方式清空浏览器缓存的方法。我这样做是因为应用程序缓存了机密数据,我想在您按“注销”时删除这些数据。这将通过服务器或 JavaScript 发生。当然,仍然不鼓励在外国/公共计算机上使用该软件,因为有更多的危险,例如您无法在软件级别上击败的键盘记录器。

6个回答

没有办法浏览器会让你清除缓存。如果可能的话,这将是一个巨大的安全问题。这很容易被滥用 - 浏览器支持这种“功能”的那一刻就是我从计算机上卸载它的那一刻。

可以做的是通过发送适当的标头或使用这些元标记来告诉它不要缓存您的页面:

<meta http-equiv='cache-control' content='no-cache'>
<meta http-equiv='expires' content='0'>
<meta http-equiv='pragma' content='no-cache'>

您可能还想考虑关闭表单字段的自动完成功能,尽管我担心有一种标准的方法可以做到这一点(请参阅此问题)。

无论如何,我想指出的是,如果您正在处理敏感数据,则应该使用 SSL。如果您不使用 SSL,任何有权访问网络的人都可以嗅探网络流量并轻松查看您的用户所看到的内容。

除非明确告知,否则使用 SSL 还会使某些浏览器使用缓存。看到这个问题

为什么我要清除我的 Web 应用程序的缓存来惹恼我的用户?我想这样做是为了清除缓存的私人数据的痕迹。如果我告诉浏览器不要缓存,它必须在每次加载页面时请求数兆字节的客户端数据,这不是我想要的。
2021-03-11 23:57:07
@rFactor 那太过分了。
2021-03-15 23:57:07
没有人会,因为显然这是不可能的。就像您不能在另一个源上运行脚本并不意味着您不能在您的源上运行脚本一样。如果您无法清除远程源上的缓存,这是合乎逻辑的,但是为什么我不能清除我正在执行代码的源的缓存?没有理由不这样做,所以我正在寻找是否有解决方案,但看起来不可能。如果您很好奇,我可以告诉您,我有一个包含大量 CSS、HTML 和 JS 的大型应用程序,它们被编译为大约 6 MB。
2021-03-21 23:57:07
也许我昨​​晚没有得到足够的睡眠,当网络应用程序可以清除(而不是更改)缓存时,它会以什么方式成为安全问题你怎么能利用它?
2021-04-03 23:57:07
请解释如何不管执行,这会是一个安全问题吗?这可以安全地实施。
2021-04-08 23:57:07

有可能,您可以简单地使用 jQuery 替换引用缓存状态的“元标记”与事件处理程序/按钮,然后刷新,简单,

$('.button').click(function() {
    $.ajax({
        url: "",
        context: document.body,
        success: function(s,x){

            $('html[manifest=saveappoffline.appcache]').attr('content', '');
                $(this).html(s);
        }
    }); 
});

注意:此解决方案依赖于作为 HTML 5 规范的一部分实现的应用程序缓存。它还需要服务器配置来设置应用程序缓存清单。它没有描述一种可以通过客户端或服务器端代码清除“传统”浏览器缓存的方法,这几乎是不可能的。

服务工作者不能在 iPhone 上工作,所以你必须在那里使用应用程序缓存
2021-03-19 23:57:07
这种方法似乎绕过缓存更新内容,但是当页面重新加载时,它又回到了之前缓存的内容。
2021-03-26 23:57:07
这只是 HTML5 功能吗?
2021-04-03 23:57:07
不推荐使用服务工作者developer.mozilla.org/en-US/docs/Web/HTML/...
2021-04-06 23:57:07
我会这么说,我相信它还需要服务器配置(设置应用程序缓存清单)。虽然此答案为原始问题提供了解决方案,但它掩盖了一个事实,即通过客户端或服务器端代码清除传统浏览器缓存几乎是不可能的。
2021-04-07 23:57:07

使用 html 本身。有一个技巧可以使用。技巧是将参数/字符串附加到脚本标记中的文件名,并在文件更改时更改它。

<script src="myfile.js?version=1.0.0"></script>

浏览器将整个字符串解释为文件路径,即使在“?”之后是什么。是参数。所以现在发生的是,下次更新文件时,只需更改网站上脚本标记中的数字(示例<script src="myfile.js?version=1.0.1"></script>),每个用户浏览器都会看到文件已更改并获取新副本。

我使用这种技术很多天了。但是我今天注意到,即使我更改了版本部分,该文件仍在从缓存中呈现。我正在使用 Chrome。即使我从服务器中删除文件后,它仍然显示。任何人都知道为什么它可能不起作用?
2021-03-15 23:57:07
2021-03-28 23:57:07
对于那些使用某些服务器端动态语言的人,如果您可以访问文件的ctime, (或mtime),则可以在其后面添加所述时间。例如,在 php 中,myfile.js?v=<?=filectime('myfile.js');?>您已经为自己的资源提供了一个自动更新缓存。
2021-04-03 23:57:07

最好的想法是用名称+一些带有版本的散列生成js文件,如果您确实需要清除缓存,只需使用新的散列生成新文件,这将触发浏览器加载新文件

最初,我在我的 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 中测试

参考:https : //wp-mix.com/disable-caching-htaccess/

这是最好的修复。
2021-04-10 23:57:07