2010-05-17 19 views
17

Estoy desarrollando una aplicación web Java EE utilizando Struts. El problema es con el almacenamiento en caché de Internet Explorer. Si un usuario cierra la sesión, puede acceder a algunas páginas porque están en caché y no se realiza ninguna solicitud. Si presiono actualizar, funciona bien. Además, si un usuario va a la página de inicio de sesión nuevamente, no lo redireccionará porque esa página también está en caché.Prevenir caché de IE

Dos soluciones vienen a la mente:

  1. Escribir un interceptor (filtro de servlet similares) para añadir a la cabecera de la respuesta no-cache, etc.
  2. O o poner <meta> etiquetas en cada página.

¿Cuál debo hacer?

+1

¿Qué versión de Struts estás utilizando? – laz

+0

He encontrado que agregar los encabezados sin caché no siempre funciona en IE. – ziggy

+0

Aparentemente olvidaste el encabezado 'Expires'. Ver también las respuestas en esta pregunta. – BalusC

Respuesta

27

Más bien establecido los siguientes encabezados en la HttpServletResponse de la página (s) en cuestión, de modo que usted no necesita CopyPaste por encima de todas las páginas 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. 

Esto equivale a establecer la siguiente meta encabezados en la página (s) de forma manual:

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

también ver this answer. No se olvide de limpiar la caché del navegador antes de la prueba;)

-1

Modificar los encabezados sin caché, etc. Es la forma habitual.

+0

Así que escribir un interceptor es mejor ... ¿Podría decirme qué encabezados agregar? Porque veo varios encabezados que deben ponerse – GorillaApe

5

que he encontrado lo siguiente para funcionar bien:

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

de las etiquetas sobre esta cuestión parece que está utilizando Struts. Struts 1.x le permite hacer esto a través de la configuración de struts-config.xml estableciendo nocache="true" en el elemento controller: caching tutorial

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

Marcos de Nottingham es el mejor recurso que he visto en la web sobre HTTP y el almacenamiento en caché si estás buscando entender más.

Dicho esto, dependiendo del problema que esté viendo, podría tratarse de un problema del historial del navegador. Consulte here para obtener más información al respecto.

+0

BTW: solo las primeras tres propiedades 'Cache-Control' como se muestra en su ejemplo es suficiente, ellos (y el encabezado' Expires') ya "implícitamente" establece las propiedades posteriores al deseado valores. – BalusC

+0

Llegamos a esos valores al investigar un problema en el que los usuarios de Opera podían ver páginas seguras en el historial de su navegador después de cerrar la sesión y destruir su sesión. Ese valor se usó como una solución. Estoy tratando de encontrar el enlace original que explica cómo se llegó a esa configuración, pero no he podido hasta ahora. Sin embargo, tal vez sea excesivo, dado que solo supe las diferencias entre el caché del navegador y el historial del navegador después de esa investigación. – laz

+0

Hubo un error relacionado con Opera 8.x que se corrigió a mitad de la década anterior. También el almacenamiento en caché de una redirección no se realizó correctamente en este navegador. Pero prácticamente nadie usa Opera 8 hoy en día. – BalusC

2

Parece que IE < 9 guardará en caché incluso si tiene pragma: no-cache en el encabezado y configura el explorador para actualizar en cada carga de página. Debe volver a agregar las metaetiquetas en una segunda sección de encabezado antes de cerrar el html. Esto es correcto desde la propia MS.

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

poco mejor explicación aquí

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

de las pruebas también necesita el Expira: -1 etiqueta meta de hacer que funcione. Se recomienda utilizar Vence: -1 y no 0.

0

Agregue el tipo de etiqueta = "botón" al botón de acción real.

El valor predeterminado del atributo de tipo depende del modo de compatibilidad de documentos actual. El valor predeterminado es enviar.En otros modos de compatibilidad, el valor predeterminado es el botón. Cuando el elemento BUTTON se envía en un formulario, el valor depende del modo de compatibilidad del documento actual. Windows Internet Explorer 8 y versiones posteriores. El valor predeterminado del atributo de tipo depende del modo de compatibilidad de documento actual. En el modo de estándares IE8, el valor predeterminado es enviar. En otros modos de compatibilidad y versiones anteriores de Windows Internet Explorer, el valor predeterminado es el botón. Internet Explorer 8 y versiones posteriores. Cuando el elemento BUTTON se envía en un formulario, el valor depende del modo de compatibilidad del documento actual. En el modo IE8, el atributo de valor se envía. En otros modos de documento y versiones anteriores de Internet Explorer, se envía el valor de innerText.

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

Cuestiones relacionadas