it-swarm.com.de

Wie leert man den Browser-Cache programmgesteuert?

Ich suche nach einer Möglichkeit, den Browser-Cache programmatisch zu leeren. Ich mache das, weil die Anwendung vertrauliche Daten zwischenspeichert, und ich möchte diese entfernen, wenn Sie auf "Abmelden" klicken. Dies würde entweder über einen Server oder über JavaScript erfolgen. Natürlich wird die Verwendung der Software auf einem ausländischen/öffentlichen Computer immer noch entmutigt, da weitere Gefahren wie Schlüssellogger bestehen, die Sie auf Softwareebene nicht überwinden können.

91
Tower

Es ist möglich, Sie können jQuery einfach verwenden, um das "Meta-Tag", das auf den Cache-Status verweist, durch einen Ereignishandler/eine Schaltfläche zu ersetzen. 

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

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

HINWEIS: Diese Lösung basiert auf dem Anwendungscache, der als Teil der HTML 5-Spezifikation implementiert ist. Es erfordert auch eine Serverkonfiguration, um das App Cache-Manifest einzurichten. Es wird keine Methode beschrieben, mit der der "herkömmliche" Browsercache über Code auf der Client- oder Serverseite gelöscht werden kann, was nahezu unmöglich ist.

35
Zeal Murapa

Es gibt keine Möglichkeit, mit einem Browser kann der Cache gelöscht werden. Wenn dies möglich wäre, wäre dies ein großes Sicherheitsrisiko. Dies kann sehr leicht missbraucht werden - sobald ein Browser eine solche "Funktion" unterstützt, wird er von dem Computer deinstalliert. 

Was Sie can tun können, ist es zu sagen, dass Sie Ihre Seite nicht zwischenspeichern möchten, indem Sie die entsprechenden Header senden oder diese Meta-Tags verwenden:

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

Möglicherweise möchten Sie auch die automatische Vervollständigung von Formularfeldern deaktivieren, obwohl ich befürchte, es gibt eine Standardmethode ( siehe diese Frage ).

Unabhängig davon möchte ich darauf hinweisen, dass Sie, wenn Sie mit vertraulichen Daten arbeiten, SSL verwenden sollten. Wenn Sie kein SSL verwenden, kann jeder, der Zugriff auf das Netzwerk hat, den Netzwerkverkehr beobachten und leicht sehen, was Ihr Benutzer sieht.

Die Verwendung von SSL bewirkt auch, dass einige Browser nicht die Zwischenspeicherung verwenden, sofern dies nicht ausdrücklich verlangt wird. Siehe diese Frage .

134

verwenden Sie html selbst. Es gibt einen Trick, der verwendet werden kann. Der Trick besteht darin, einen Parameter/eine Zeichenfolge an den Dateinamen im Script-Tag anzuhängen und ihn zu ändern, wenn Sie die Datei ändern.

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

Der Browser interpretiert die gesamte Zeichenfolge als Dateipfad, auch wenn nach dem "?" sind Parameter. Nun passiert es also, dass das nächste Mal, wenn Sie Ihre Datei aktualisieren, einfach die Nummer im Skript-Tag auf Ihrer Website ändert (Beispiel <script src="myfile.js?version=1.0.1"></script>), und jeder Browser des Benutzers wird sehen, dass sich die Datei geändert hat und eine neue Kopie erhält.

12
Joish

Die beste Idee ist, js-Dateigenerierung mit Name + etwas Hash mit Version zu machen. Wenn Sie den Cache leeren müssen, erstellen Sie einfach neue Dateien mit neuem Hash, wodurch der Browser neue Dateien lädt

7
Admiral Duck

In Chrome sollten Sie dazu die Benchmarking-Erweiterung verwenden können. Sie müssen Ihr Chrome mit den folgenden Schaltern starten:

./chrome --enable-benchmarking --enable-net-benchmarking 

In der Chrome-Konsole können Sie jetzt Folgendes tun:

chrome.benchmarking.clearCache();
chrome.benchmarking.clearHostResolverCache();
chrome.benchmarking.clearPredictorCache();
chrome.benchmarking.closeConnections();

Wie Sie anhand der obigen Befehle erkennen können, wird der Browser-Cache nicht nur gelöscht, sondern auch der DNS-Cache und die Netzwerkverbindungen werden geschlossen. Dies ist ideal, wenn Sie das Benchmarking für das Laden von Seiten durchführen. Natürlich müssen Sie sie nicht alle verwenden, wenn sie nicht benötigt werden (beispielsweise clearCache () sollte ausreichen, wenn Sie nur den Cache leeren müssen und sich nicht um DNS-Cache und -Verbindungen kümmern).

3
kakhkAtion

location.reload (true); wird die aktuelle Seite hart laden und den Cache ignorieren .
Cache.delete () kann auch für neues Chrome, Firefox und Oper verwendet werden.

3
Jay Shah

Anfangs versuchte ich in meiner HTML-Datei, JS, verschiedene programmatische Methoden zu verwenden, um den Browser-Cache zu löschen. Beim neuesten Chrome funktioniert nichts.

Schließlich endete ich mit .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>

Getestet in Chrome, Firefox, Opera

Referenz: https://wp-mix.com/disable-caching-htaccess/

3
rajagopalx

Sie können jetzt Cache.delete () verwenden.

Beispiel:

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)
    }
  }));

Funktioniert auf Chrome 40+, Firefox 39+, Opera 27+ und Edge.

1
r.delic

//The code below should be put in the "js" folder with the name "clear-browser-cache.js"

(function () {
    var process_scripts = false;
    var rep = /.*\?.*/,
    links = document.getElementsByTagName('link'),
    scripts = document.getElementsByTagName('script');
    var value = document.getElementsByName('clear-browser-cache');
    for (var i = 0; i < value.length; i++) {
        var val = value[i],
            outerHTML = val.outerHTML;
        var check = /.*value="true".*/;
        if (check.test(outerHTML)) {
            process_scripts = true;
        }
    }
    for (var i = 0; i < links.length; i++) {
        var link = links[i],
        href = link.href;
        if (rep.test(href)) {
            link.href = href + '&' + Date.now();
        }
        else {
            link.href = href + '?' + Date.now();
        }
    }
    if (process_scripts) {
        for (var i = 0; i < scripts.length; i++) {
            var script = scripts[i],
            src = script.src;
            if (src !== "") {
                if (rep.test(src)) {
                    script.src = src + '&' + Date.now();
                }
                else {
                    script.src = src + '?' + Date.now();
                }
            }
        }
    }
})();
At the end of the tah head, place the line at the code below

    < script name="clear-browser-cache" src='js/clear-browser-cache.js' value="true" >< /script >

1
haimirick

Stellen Sie sich vor, die .js-Dateien werden in /my-site/some/path/ui/js/myfile.js abgelegt.

Normalerweise würde das Skript-Tag also so aussehen:

<script src="/my-site/some/path/ui/js/myfile.js"></script>

Ändern Sie nun das zu:

<script src="/my-site/some/path/ui-1111111111/js/myfile.js"></script>

Das wird natürlich nicht funktionieren. Damit es funktioniert, müssen Sie Ihrem .htaccess.__ eine oder einige Zeilen hinzufügen. Die wichtige Zeile lautet: (Der gesamte .htaccess unten)

RewriteRule ^my-site\/(.*)\/ui\-([0-9]+)\/(.*) my-site/$1/ui/$3 [L]

Was dies bedeutet, entfernt den Code 1111111111 von dem Pfad und verlinkt den richtigen Pfad. 

Wenn Sie also Änderungen vornehmen, müssen Sie lediglich die Nummer 1111111111 in die gewünschte Nummer ändern. Und obwohl Sie Ihre Dateien einbeziehen, können Sie diese Nummer über einen Zeitstempel festlegen, wenn die js-Datei zuletzt geändert wurde. Der Cache funktioniert also normal, wenn sich die Anzahl nicht ändert. Wenn es sich ändert, wird die neue Datei bereitgestellt (JA IMMER), da der Browser eine vollständig neue URL erhält und nur glaubt, dass die Datei so neu ist, dass er sie abrufen muss.

Sie können dies für CSS, favicons und was auch immer zwischengespeichert wird, verwenden. Für CSS einfach so verwenden

<link href="http://my-domain.com/my-site/some/path/ui-1492513798/css/page.css" type="text/css" rel="stylesheet">

Und es wird funktionieren! Einfach zu aktualisieren, einfach zu warten.

Der versprochene volle Erfolg

Wenn Sie noch keinen .htaccess haben, ist dies das Minimum, das Sie dort haben müssen:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteRule ^my-site\/(.*)\/ui\-([0-9]+)\/(.*) my-site/$1/ui/$3 [L]
</IfModule>
0
caramba