2010-08-16 11 views
7

Ho una pagina Java/Wicket che genera un file JNLP che avvia il software della mia azienda. Questa classe opzionalmente accetta alcuni parametri url e li incorpora come argomenti nel JNLP. Quando l'utente avvia questo file JNLP, l'applicazione client eseguirà alcune funzioni in base a tali parametri. Se il software client è già in esecuzione sulla macchina, premendo la pagina JNLP tenterà invece di alimentare questi parametri tramite una chiamata remota al client in esecuzione anziché avviare una nuova pagina.Java/Wicket - Come bloccare i browser dalle pagine di cache?

Questa parte è dove sto avendo problemi. Su IE, Firefox e Chrome ho potuto aprire un nuovo client, ma provare a colpire di nuovo lo stesso URL restituirebbe invece un file JNLP. Ho scoperto che la cancellazione della cache del browser corregge questo problema su tutti i browser. Inoltre, non riesco a colpire i punti di interruzione nella classe JNLP, il che rafforza la mia impressione che questo sia più un problema con la richiesta che qualcosa di strano con Wicket.

ho messo il seguente codice nella mia classe pagina, che si estende 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"); 
    } 
} 

Questo non sembra funzionare, come Firefox 3.6 sembra ancora per memorizzare il risultato nella cache. IE 7 funzionerà ma solo dopo aver provato il collegamento creo alcune volte. Non so molto sullo sviluppo web e Wicket e questo è nuovo per me, quindi è possibile che mi manchi qualcosa di semplice.

TL; DR: Come faccio a ottenere una pagina Wicket per non eseguire la cache sul browser client?

+0

hai provato ad aggiungere '' al markup della pagina? – Gytis

risposta

5

Un attacco utilizzato in alcuni interni di Wicket (vedere ad esempio la fonte per org.apache.wicket.markup.html.image.NonCachingImage) consiste nell'aggiungere rumore casuale all'URL.

In pratica, se si sta generando l'url richiamato dal browser, è possibile aggiungere un parametro ignorato dall'applicazione Web che varia in modo casuale e inganna il browser in modo da ignorarne la cache.

+0

Questo sembra essere l'unico modo semplice, poiché la soluzione di Joao Pinto non sembra funzionare con nessun browser, con le pagine servite da Jetty 6. –

2

Si prega di verificare la seguente pagina: http://palisade.plynt.com/issues/2008Jul/cache-control-attributes/

Firefox dovrebbe onorare l'intestazione "Cache-Control".

+1

Anche se questo non risolve direttamente il mio problema, questo collegamento è davvero eccezionale e spiega cosa fanno tutte queste direttive.Non sono davvero un ragazzo del web, quindi molte di queste cose sono un mistero per me. –

0

Non conosco Wicket molto bene ma hai provato a utilizzare WebResponse.setLastModifiedTime(Time time)? So che FF invia un'intestazione a cui il server risponderebbe con 304 Not Modified o la risposta normale.

Mi sembra naturale che il server controlli lo lastModifiedTime su WebResponse per decidere.

Se ciò non aiuta suggerisco di ottenere Firebug per Firefox e dare un'occhiata alle richieste e alle risposte.

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

Questo funziona con IE, Firefox e così via, l'unico browser con il quale certamente non funziona è konqueror.

0

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

0

Hai mai provato a caricare le pagine utilizzando window.location.replace?

Problemi correlati