2010-05-17 4 views
17

Je développe une application Web Java EE à l'aide de Struts. Le problème est avec la mise en cache d'Internet Explorer. Si un utilisateur se déconnecte, il peut accéder à certaines pages car elles sont mises en cache et aucune demande n'est effectuée. Si je réussis à rafraîchir ça fonctionne bien. De plus, si un utilisateur se rend à la page de connexion, il ne le redirigera pas, car cette page est également mise en cache.Empêcher la mise en cache IE

Deux solutions viennent à l'esprit:

  1. Ecrire un à ajouter à en-tête de réponse Interceptor (filtre de servlet comme) no-cache, etc.
  2. Ou ou mettre <meta> balises à chaque page.

Lequel dois-je faire?

+1

Quelle version de Struts utilisez-vous? – laz

+0

J'ai trouvé que l'ajout des en-têtes no-cache ne fonctionne pas toujours sur IE. – ziggy

+0

Apparemment, vous avez oublié l'en-tête 'Expires'. Voir aussi les réponses à cette question. – BalusC

Répondre

27

plutôt définir les en-têtes suivants sur la HttpServletResponse de la page (s) en question afin que vous ne avez pas besoin de copypaste il sur toutes les pages manuellement:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
response.setDateHeader("Expires", 0); // Proxies. 

Cela équivaut à la mise en Meta suivante les en-têtes dans la page (s) manuellement:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> 
<meta http-equiv="Pragma" content="no-cache"> 
<meta http-equiv="Expires" content="0"> 

voir aussi this answer. Ne pas oublier de vider le cache du navigateur avant le test;)

-1

Modifiez les en-têtes sans cache, etc. C'est la manière habituelle.

+0

Il est donc préférable d'écrire un intercepteur ... Pourriez-vous me dire quels en-têtes ajouter? Parce que je vois plusieurs en-têtes qui devraient être mis – GorillaApe

5

J'ai trouvé ce qui suit pour bien fonctionner:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform, pre-check=0, post-check=0, private"); 
response.setHeader("Pragma", "no-cache"); 
response.setDateHeader("Expires", 0); 

Des balises sur cette question, il semble que vous utilisez Struts. 1.x Struts vous permet de le faire grâce à la configuration dans struts-config.xml en mettant nocache="true" sur l'élément controller:

<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor" nocache="true" /> 

Mark Nottingham caching tutorial est la meilleure que je l'ai vu sur le web sur HTTP et la mise en cache si vous cherchez à comprendre plus. Ceci étant dit, selon le problème que vous voyez, il peut s'agir d'un problème d'historique du navigateur. Voir here pour plus d'informations à ce sujet.

+0

BTW: seulement les trois premières propriétés 'Cache-Control' montrées dans votre exemple sont suffisantes, elles (et l'en-tête' Expires') déjà implicitement les propriétés suivantes à la valeur désirée valeurs. – BalusC

+0

Nous sommes arrivés à ces valeurs tout en recherchant un problème où les utilisateurs d'Opera pouvaient afficher des pages sécurisées dans l'historique de leur navigateur après s'être déconnecté et avoir détruit leur session. Cette valeur a été utilisée comme solution. J'essaie de trouver le lien d'origine qui explique comment ces paramètres ont été atteints, mais je n'ai pas été en mesure de le faire. Peut-être est-ce exagéré cependant étant donné que j'ai seulement appris sur les différences entre le cache du navigateur et l'histoire du navigateur après cette recherche. – laz

+0

Il y avait en effet un bug Opera 8.x qui a été corrigé à mi-chemin de la décennie précédente. La mise en cache d'une redirection n'a pas été effectuée correctement dans ce navigateur. Mais pratiquement personne n'utilise Opera 8 de nos jours. – BalusC

2

On dirait que IE < 9 sera toujours en mémoire cache même si vous avez pragma: pas de cache dans la tête et définir le navigateur pour actualiser à chaque chargement de la page. Vous devez ajouter les balises Meta à nouveau dans une deuxième section avant la fermeture du code HTML. C'est juste de MS elle-même.

http://support.microsoft.com/kb/222064/

peu meilleure explication ici

http://www.htmlgoodies.com/beyond/reference/article.php/3472881/So-You-Dont-Want-To-Cache-Huh.htm

De vous tester aussi besoin Expires: -1 balise meta pour le faire fonctionner. Il est recommandé d'utiliser Expires: -1 et non 0.

0

Ajouter un type de tag = "bouton" dans le bouton d'action réel.

La valeur par défaut de l'attribut type dépend du mode de compatibilité du document en cours. La valeur par défaut est submit.Dans les autres modes de compatibilité, la valeur par défaut est le bouton. Lorsque l'élément BUTTON est soumis dans un formulaire, la valeur dépend du mode de compatibilité du document en cours. Windows Internet Explorer 8 et versions ultérieures. La valeur par défaut de l'attribut type dépend du mode de compatibilité du document en cours. En mode Standards IE8, la valeur par défaut est submit. Dans les autres modes de compatibilité et les versions antérieures de Windows Internet Explorer, la valeur par défaut est button. Internet Explorer 8 et versions ultérieures. Lorsque l'élément BUTTON est soumis dans un formulaire, la valeur dépend du mode de compatibilité du document en cours. En mode IE8, l'attribut de valeur est soumis. Dans les autres modes de document et les versions antérieures d'Internet Explorer, la valeur innerText est soumise.

http://msdn.microsoft.com/en-us/library/ie/ms535211(v=vs.85).aspx

Questions connexes