2010-08-16 15 views
7

Tengo una página de Java/Wicket que genera un archivo JNLP que inicia el software de mi empresa. Esta clase tomará opcionalmente algunos parámetros de URL e incrústelos como argumentos en el JNLP. Cuando el usuario inicia este archivo JNLP, la aplicación del cliente realizará alguna función basada en esos parámetros. Si el software del cliente ya se está ejecutando en la máquina, al presionar la página JNLP se intentará alimentar estos parámetros mediante una llamada remota al cliente en ejecución en lugar de abrir una página nueva.Java/Wicket: cómo evitar que los navegadores guarden en caché las páginas?

Esta parte es donde tengo problemas. En IE, Firefox y Chrome podría abrir un nuevo cliente, pero tratar de golpear la misma URL nuevamente devolvería un archivo JNLP. Descubrí que borrar el caché del navegador corrige este problema en todos los navegadores. Además, parece que no puedo acceder a los puntos de interrupción en la clase JNLP, lo que refuerza mi presentimiento de que esto es más un problema con la solicitud que algo extraño con Wicket.

puse el código siguiente en mi clase de página, que se extiende org.apache.wicket.markup.html.WebPage:

@Override 
protected void setHeaders(WebResponse response) { 
    getPageMap().remove(this); 
    HttpServletResponse httpServletResponse = response.getHttpServletResponse(); 
    if (httpServletResponse != null) { 
     httpServletResponse.setDateHeader("Expires", 0); 
     httpServletResponse.addHeader("Cache-Control", "no-cache,no-store,private,must-revalidate,max-stale=0,post-check=0,pre-check=0"); 
     httpServletResponse.addHeader("Keep-Alive", "timeout=3, max=993"); 
    } 
} 

Esto no parece funcionar, como Firefox 3.6 sigue pareciendo para almacenar el resultado en caché IE 7 funcionará pero solo después de probar el enlace creo unas cuantas veces. No sé mucho sobre desarrollo web y Wicket y esto es nuevo para mí, así que es posible que me esté perdiendo algo simple.

TL; DR: ¿Cómo obtengo una página Wicket para no almacenar en caché en el navegador del cliente?

+0

intenté agregar '' al marcado de la página? – Gytis

Respuesta

5

Un truco utilizado en algunas de las partes internas de Wicket (consulte, por ejemplo, la fuente de org.apache.wicket.markup.html.image.NonCachingImage) consiste en agregar ruido aleatorio a la url.

Básicamente, si está generando las direcciones URL que llama el navegador, puede agregar un parámetro ignorado por la aplicación web que varía aleatoriamente y engaña al navegador para que ignore su caché.

+0

Esta parece ser la única manera fácil, ya que la solución de Joao Pinto no parece funcionar con ningún navegador, con las páginas atendidas por Jetty 6. –

2

Por favor, compruebe la siguiente página: http://palisade.plynt.com/issues/2008Jul/cache-control-attributes/

Firefox debería cumplir el "Cache-Control" de cabecera.

+1

Si bien esto no resuelve directamente mi problema, este enlace es realmente genial y explica lo que hacen todas estas directivas.No soy realmente un chico de la red, así que muchas de estas cosas son un misterio para mí. –

0

No sé Wicket muy bien, pero ¿ha intentado usar WebResponse.setLastModifiedTime(Time time)? Sé que FF envía un encabezado If-Modified-Since al cual su servidor respondería con 304 Not Modified o la respuesta normal.

Me parece natural que su servidor compruebe el lastModifiedTime en WebResponse para decidir.

Si eso no ayuda, le sugiero que obtenga Firebug para Firefox y eche un vistazo a las solicitudes y respuestas.

0
response.setHeader("Expires", "0"); 
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, private"); 
response.setHeader("Pragma", "no-cache"); 

Esto funciona con IE, Firefox, etc., el único navegador con el que ciertamente no funciona es konqueror.

0

Wicket 6.11.0: Application.get(). GetResourceSettings(). SetDefaultCacheDuration (Duration.NONE);

0

¿Alguna vez ha intentado cargar páginas usando window.location.replace?

Cuestiones relacionadas