157 votes

Comment vider le cache du navigateur de manière programmatique ?

Je cherche un moyen de vider le cache du navigateur de manière programmatique. Je fais cela parce que l'application met en cache des données confidentielles et j'aimerais les supprimer lorsque vous appuyez sur "log out". Cela se ferait soit par le serveur, soit par JavaScript. Bien entendu, il est toujours déconseillé d'utiliser le logiciel sur un ordinateur étranger ou public, car il existe d'autres dangers, comme les enregistreurs de frappe, qui ne peuvent pas être éliminés au niveau du logiciel.

3 votes

Quels navigateurs ? Vous devriez également envisager de dire au navigateur ce qu'il ne doit pas mettre en cache depuis le serveur plutôt que d'essayer de l'effacer.

1 votes

Vous pouvez également consulter ce tutoriel sur la mise en cache et son fonctionnement. mnot.net/cache_docs couvre les en-têtes de contrôle du cache et des choses comme ça

0 votes

@MechSoftware Je veux mettre en cache pour accélérer le chargement des pages, mais je veux l'effacer après la déconnexion. Il est préférable d'avoir un support de navigateur aussi bon que possible.

182voto

NullUserException Points 42268

Il y a pas du tout un navigateur vous permettra de vider son cache. Ce serait un énorme problème de sécurité si cela était possible. Il serait très facile d'en abuser. Dès qu'un navigateur prendra en charge une telle "fonctionnalité", je le désinstallerai de mon ordinateur.

Ce que vous peut est de lui dire de ne pas mettre votre page en cache, en envoyant les en-têtes appropriés ou en utilisant ces métabalises :

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

Vous pouvez également envisager de désactiver l'auto-complétion des champs de formulaire, même si je crains qu'il n'existe pas de méthode standard pour le faire ( voir cette question ).

Quoi qu'il en soit, je tiens à souligner que si vous travaillez avec des données sensibles, vous devez utiliser le protocole SSL. Si vous n'utilisez pas SSL, toute personne ayant accès au réseau peut renifler le trafic réseau et voir facilement ce que votre utilisateur voit.

L'utilisation de SSL fait aussi que certains navigateurs pas utiliser la mise en cache, à moins qu'on ne le demande explicitement. Voir cette question .

9 votes

Pourquoi est-ce que je viderais le cache de mon application web pour ennuyer mes utilisateurs ? Je veux le faire pour effacer les traces de données privées mises en cache. Si je dis au navigateur de ne pas mettre en cache, il doit demander des mégaoctets de données côté client à chaque chargement de la page, ce que je ne veux pas faire.

1 votes

@rFactor Je ne suis pas en train de dire vous Je dis que si c'était possible, certaines personnes le feraient.

0 votes

@rFactor Qu'est-ce que vous envoyez qui nécessite que le client "demande". mégaoctets de données à chaque fois que la page se charge" ?

44voto

Zeal Murapa Points 160

C'est possible, vous pouvez simplement utiliser jQuery pour remplacer la "méta-tag" qui fait référence à l'état du cache par un gestionnaire d'événement/bouton, puis actualiser, facile,

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

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

REMARQUE : cette solution repose sur l'Application Cache qui est mis en œuvre dans le cadre de la spécification HTML 5. Elle nécessite également une configuration du serveur pour mettre en place le manifeste App Cache. Elle ne décrit pas une méthode permettant d'effacer le cache "traditionnel" du navigateur via un code côté client ou côté serveur, ce qui est pratiquement impossible à faire.

0 votes

S'agit-il uniquement d'une fonctionnalité HTML5 ?

0 votes

Je dirais que oui, et je crois que cela nécessite également une configuration du serveur (pour mettre en place le manifeste du cache des applications). Si cette réponse apporte une solution à la question initiale, elle occulte le fait qu'il est pratiquement impossible de vider le cache traditionnel du navigateur par le biais d'un code côté client ou côté serveur.

0 votes

Cette méthode semble contourner le cache et mettre à jour le contenu, mais lorsque la page est rechargée, elle revient au contenu précédemment mis en cache.

26voto

Joish Points 329

Il y a une astuce qui peut être utilisée. L'astuce est d'ajouter un paramètre/chaîne au nom du fichier dans la balise script et de le changer quand le fichier change.

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

Le navigateur interprète l'ensemble de la chaîne comme le chemin d'accès au fichier, même si ce qui suit le " ?" est un paramètre. Ainsi, la prochaine fois que vous mettrez à jour votre fichier, il vous suffira de changer le nombre dans la balise script de votre site web (exemple <script src="myfile.js?version=1.0.1"></script> ) et le navigateur de chaque utilisateur verra que le fichier a été modifié et en prendra une nouvelle copie.

1 votes

Pour ceux qui utilisent un langage dynamique côté serveur, si vous pouvez accéder à l'adresse du fichier ctime (ou mtime ), vous pouvez simplement ajouter ledit temps derrière lui. Par exemple, en php, myfile.js?v=<?=filectime('myfile.js');?> et vous disposez ainsi d'un cache à mise à jour automatique pour vos ressources.

0 votes

J'ai utilisé cette technique pendant plusieurs jours. Mais j'ai remarqué aujourd'hui que le fichier est toujours rendu à partir du cache, même après avoir changé la partie version. J'utilisais Chrome. Il s'affichait même après avoir supprimé le fichier du serveur. Quelqu'un a-t-il une idée de la raison pour laquelle cela ne fonctionne pas ?

0 votes

Cette astuce fonctionne, stackoverflow.com/questions/1922910/

9voto

Admiral Duck Points 91

La meilleure idée est de générer des fichiers js avec le nom + un hash avec la version, si vous avez besoin de vider le cache, il suffit de générer de nouveaux fichiers avec le nouveau hash, ce qui déclenchera le navigateur pour charger les nouveaux fichiers.

8voto

bdombro Points 46

Voici un exemple simple de la façon dont vous pouvez supprimer TOUTES les caches réseau des navigateurs en utilisant Cache.delete()

caches.keys().then((keyList) => Promise.all(keyList.map((key) => caches.delete(key))))

Fonctionne sur Chrome 40+, Firefox 39+, Opera 27+ et Edge.

11 votes

Cela ne concerne que les éléments que les scripts (généralement dans un Service Worker) ont explicitement stockés en utilisant l'API Cache. Elle ne donne pas accès au cache HTTP(s) du navigateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X