Deshabilitar Cache-Control en JBoss/Tomcat


En recientes fechas el usuario de una aplicación de consulta por la Intranet nos ha solicitado la securización de la misma vía nombre de usuario y contraseña. Al hacer esto, nos han reportado una incidencia por la que al intentar guardar una imagen en formato JPG con Internet Explorer (pulsando el botón derecho y seleccionando la opción Guardar Imagen como…), el único formato en el que permite guardar es BMP. Antes de la modificación, la imagen podía almacenarse en el formato original (tanto el content-type: image/jpg como el filename se añaden a la cabecera en el servidor). Tras esto detectamos problemas al descargar ficheros pdf, pero únicamente si lo hacemos con Internet Explorer, ni Chrome, ni Firefox, ni Safari actuaban de esta forma.

Investigando un poco el tema descubrimos que el problema venía por unas cabeceras de respuesta en la petición HTTP que misteriosamente aparecían al servir la imagen:

Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 01:00:00 CET

Estas cabeceras siempre las añade JBoss (por defecto) a la petición cuando la aplicación se encuentra en un entorno seguro para evitar que se cacheen los recursos. Internet Explorer las interpreta de una manera diferente a los demás navegadores y a saber por qué razón no permite descargar los ficheros o guardarlos en un formato diferente, aunque todo indica que es por motivos de seguridad.

Hemos encontrado un método de evitar esto. Se trata de incorporar una válvula (Valve) al contexto de nuestra aplicación web, que indique a JBoss que deshabilite el control de la cache para los recursos securizados. Para ello nos creamos un fichero context.xml (más información sobre el contexto de las aplicaciones web en JBoss/Tomcat) dentro de la carpeta web-inf de nuestra aplicación web:
<Context>
<Valve className="org.apache.catalina.authenticator.FormAuthenticator"
disableProxyCaching="false" ></Valve>
</Context>

En nuestro caso utilizamos esta manera, ya que la autenticación está basada en formulario, tal y como configuramos en el fichero web.xml de la aplicación. Si el tipo de autenticación es HTTP Básica, entonces utilizaremos:
<Context>
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator"
disableProxyCaching="false" ></Valve>
</Context>

Con esto las cabeceras que indicamos más arriba no son añadidas por JBoss y solucionamos los problemas ocasionados en Internet Explorer. Esto no quiere decir que no podamos deshabilitar la caché para un recurso, sólo indica que somos nosotros los que controlamos este comportamiento, pudiendo añadir en el servidor las cabeceras para las peticiones que nos interesen, mediante el método:

response.addHeader("Cache-Control", "no-cache");

Este error no es exclusivo de JBoss, ocurre igualmente en Tomcat (JBoss está construido sobre Tomcat). La versión de JBoss que utilizamos es la 4.0.2 y las versiones de Internet Explorer en las que hemos probado son la 7 y la 8.


Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para su aceptación y la de nuestra política de cookies.

ACEPTAR
Aviso de cookies