2010-05-17 22 views
17

Sto sviluppando un'applicazione web Java EE utilizzando Struts. Il problema è con la memorizzazione nella cache di Internet Explorer. Se un utente si disconnette, può accedere ad alcune pagine perché sono memorizzate nella cache e nessuna richiesta viene effettuata. Se colpisco l'aggiornamento funziona bene. Inoltre, se un utente accede nuovamente alla pagina di accesso, non lo reindirizzerà perché anche quella pagina viene memorizzata nella cache.Evita la memorizzazione nella cache di IE

due soluzioni vengono in mente:

  1. Scrivere un Interceptor (filtro servlet simili) da aggiungere alla risposta di intestazione no-cache ecc
  2. Or o mettere <meta> tag ad ogni pagina.

Quale dovrei fare?

+1

Quale versione di Struts stai usando? – laz

+0

Ho riscontrato che l'aggiunta delle intestazioni no-cache non funziona sempre su IE. – ziggy

+0

A quanto pare hai dimenticato l'intestazione 'Expires'. Vedi anche le risposte in questa domanda. – BalusC

risposta

27

Piuttosto impostare le seguenti intestazioni sulla HttpServletResponse della pagina (s) in questione, in modo che non c'è bisogno di CopyPaste sopra tutte le pagine manualmente:

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. 

Ciò equivale a impostare il seguente meta intestazioni nella pagina (s) manualmente:

<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"> 

vedono anche this answer. Non dimenticare di cancellare la cache del browser prima del test;)

-1

Modificare le intestazioni con no-cache, ecc. È il solito modo.

+0

Quindi scrivere un intercettore è meglio ... Potresti dirmi quali intestazioni aggiungere? Perché vedo molte intestazioni che dovrebbero essere messe – GorillaApe

5

ho trovato quanto segue per lavorare bene:

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

dai tag su questa questione sembra che si sta utilizzando Struts. Struts 1.x ti permette di fare questo attraverso la configurazione di struts-config.xml impostando nocache="true" sull'elemento controller: caching tutorial

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

Marco Nottingham è la miglior risorsa che ho visto sul web su HTTP e caching se stai cercando di capire di più

Detto questo, a seconda del problema che si sta verificando potrebbe essere un problema di cronologia del browser. Vedere here per ulteriori informazioni a riguardo.

+0

BTW: solo le prime tre proprietà 'Cache-Control' come mostrato nell'esempio sono sufficienti, esse (e l'intestazione' Expires') già "implicitamente" imposta le proprietà successive al desiderato valori. – BalusC

+0

Siamo arrivati ​​a questi valori durante la ricerca di un problema in cui gli utenti di Opera erano in grado di visualizzare le pagine protette nella loro cronologia del browser dopo la disconnessione e la distruzione della loro sessione. Quel valore è stato usato come una correzione. Sto cercando di trovare il link originale che spieghi come sono state raggiunte queste impostazioni, ma finora non sono stato in grado di farlo. Forse è eccessivo, dato che ho solo imparato a conoscere le differenze tra la cache del browser e la cronologia del browser dopo quella ricerca. – laz

+0

C'era effettivamente un bug di Opera 8.x che era stato risolto a metà del decennio precedente. Anche la memorizzazione nella cache di un reindirizzamento non è stata eseguita correttamente in questo browser. Ma praticamente nessuno usa Opera 8 al giorno d'oggi. – BalusC

2

Sembra che IE < 9 continui a memorizzare anche se si dispone di pragma: no-cache in testa e imposta il browser per l'aggiornamento su ogni caricamento della pagina. È necessario aggiungere nuovamente i metatag in una seconda sezione prima di chiudere l'html. Questo è proprio dalla MS stessa.

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

po 'meglio spiegazione qui

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

Da voi testando anche bisogno del Scadenza: -1 meta tag per farlo funzionare. Si consiglia di utilizzare Scade: -1 e non 0.

0

Aggiungere il tipo di tag = "pulsante" nel pulsante di azione effettivo.

Il valore predefinito dell'attributo type dipende dalla modalità di compatibilità del documento corrente. Il valore predefinito è submit.In altre modalità di compatibilità il valore predefinito è il pulsante. Quando l'elemento BUTTON viene inviato in un modulo, il valore dipende dalla modalità di compatibilità del documento corrente. Windows Internet Explorer 8 e versioni successive. Il valore predefinito dell'attributo type dipende dalla modalità di compatibilità del documento corrente. Nella modalità Standard IE8, il valore predefinito è submit. In altre modalità di compatibilità e versioni precedenti di Windows Internet Explorer, il valore predefinito è il pulsante. Internet Explorer 8 e versioni successive. Quando l'elemento BUTTON viene inviato in un modulo, il valore dipende dalla modalità di compatibilità del documento corrente. In modalità IE8, l'attributo value viene inviato. In altre modalità documento e versioni precedenti di Internet Explorer, viene inviato il valore innerText.

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

Problemi correlati