No Cache, No Store, Internet Explorer en problemas !!!

miércoles, 19 de noviembre de 2008
Hace meses estoy desarrollando un sistema de administración de prácticas profesionales para la Escuela de Ingeniería Civil de la Universidad Andrés Bello (en Chile).

Resulta que lo estoy desarrollando en Java utilizando el IDE NetBeans 6.5 (partí usando el 6.0, luego el 6.1), uso JSP, Servlets, AJAX (con JMAKI), CSS2, una biblioteca para PDF llamada iText, para el almacenamiento de datos utilizo MySQL (5.0.67) y el servidor de aplicaciones es, por supuesto, Glassfish V2 UR2.

El sistema funciona correctamente corriendo en Windows o Linux. Yo utilizo Firefox y firebug no me ha encontrado ningún error en ninguna parte del sistema. El problema lo tuve al querer acceder al sistema utilizando el "navegador web" Internet Explorer (6.0, 7.0, 8.0Beta2, sobre Windows XP SP1, SP2 y SP3). Siempre que quería acceder me salia el siguiente error:
Internet Explorer cannot download index.jsp from localhost
Internet Explorer was not able to open this Internet site. The requested site is either unavailable or cannot be found.
Please try again later.
Aquí una imagen mostrando la pantalla de error en Windows XP SP3:


Esto me ha traido dolores de cabeza por bastante tiempo, busqué y busqué en Internet sin respuestas satisfactorias. De pronto llegué a una página de Microsoft donde sale el problema de "Internet explorer cannot download". Ahí sale que ese error ocurre cuando la URL es segura (HTTPS) (NO es mi caso).

Entre las causas del error sale el uso de las cabeceras "no-cache" y "no-store". Precisamente en mi sistema utilizo esas cabeceras en todos los JSP por seguridad y consistencia. En esa misma página se reconoce que el problema es de los productos Microsoft (para variar ...... ¬¬), en Internet Explorer 6.0 SP1. Aprovecho para comunicar a la gente de Microsoft que aún no solucionan el problema en todas las versiones posteriores a la 6.0 SP1.

Lo mas ridículo de todo lo que sale en esa página de Microsoft es el WORKAROUND:
To work around this problem, make sure that Do Not Save Encrypted Files check box is not checked and that the server does not send the "Cache-Control: No Store" or the "Cache-Control: No Cache" header.

Y en español dice:
Para solucionar este problema, asegúrese que la opción No Guardar Archivos Encriptados no esté marcada y que el servidor no envíe la cabecera "Cache-Control: No Store" o la "Cache-Control: No Cache".
Inteligente la solución ¬¬, si usted es un usuario, como puede hacer que el servidor no envíe esas cabeceras ?? si usted es desarrollador de software y realmente necesita que no se almacenen los datos en el cache del navegador, va a permitir que Microsoft le de una respuesta tan absurda ??

Bueno, ese es el problema. La solución no era tan complicada, tediosa si. Se debe agregar a TODOS los JSP las siguientes líneas (se agregan al principio, fuera de la etiqueta <html>):
response.setHeader("Cache-Control","no-cache");
response.setHeader("Cache-Control","no-store");
response.setHeader("Cache-Control","must-revalidate");
response.setHeader("Pragma","no-cache");
response.setDateHeader ("Expires", 0);
Para que la solución quede mas elegante se puede crear un fragmento de JSP, un archivo JSPF e insertar esas lineas ahí y luego en los JSP agregar un include que apunte al fragmento, así:
<jsp:directive.include file="../WEB-INF/jspf/NoCache.jspf">

Ya con eso el problema está solucionado, ahora el sistema funciona en Firefox e Internet Explorer.

Desgraciadamente aún hay que hacer excepciones para el navegador mas usado, pues no sigue estándares y lo que hace lo hace casi siempre mal, esta es solo una de las cosas que tuve que realizar para que el sistema funcionara con Internet Explorer, también tuve que hacerlo al crear archivos PDF para que el IE los pudiera descargar, entre otras cosas.

Ya saben, si les ocurre este problema ya tienen una solución.

saludos !!!

2 comentarios:

Anónimo dijo...

Hey! Thanks so much for your article, it was very helpful for me.

Unknown dijo...

Hola Daniel Dario Morales Salas:

Trabajo con las mismas herramientas que tu. y encontre que cuando lo pruebo en el entorno de desarrollo funciona , pero no funciona cuando subo mi .war al servidor de pruebas,

Tienes alguna sugerencia?

Muchas gracias!

Publicar un comentario