Sto sviluppando un'app Web utilizzando GWT e vedo un pazzo problema con il caching del file app.nocache.js
nel browser anche se il server Web ha inviato una nuova copia del file!Come bloccare il browser nella cache GWT nocache.js
Sto utilizzando Eclipse per compilare l'app, che funziona in modalità dev. Per testare la modalità di produzione, ho una macchina virtuale (Oracle VirtualBox) con un sistema operativo guest Ubuntu in esecuzione sul mio computer host (Windows 7). Sto eseguendo il server web lighttpd nella VM. La VM condivide la directory di guerra del mio progetto e il server web sta servendo questa directory.
Sto utilizzando Chrome come browser, ma la stessa cosa accade in Firefox.
Ecco lo scenario:
- La pagina web per l'applicazione è vuota. Accorind allo strumento "Ispeziona elemento" di Chrome, è perché sta cercando di recuperare
6E89D5C912DD8F3F806083C8AA626B83.cache.html
, che non esiste (404 not found
). - Controllo la directory di guerra, e abbastanza sicuro, che il file non esiste.
- Il
app.nocache.js
sul browser È STATO RICARICATO dal server Web (200 OK), perché il file sul server era più recente della cache del browser. Ho verificato che la dimensione del file e il timestamp per il nuovo file restituito dal server fossero corretti. (Si tratta di informazioni sui report di Chrome sulla risposta HTTP del server) Tuttavia, se apro lo
app.nocache.js
nel browser, il javascript si riferisce a6E89D5C912DD8F3F806083C8AA626B83.cache.html
!!! Cioè, anche se il server Web ha inviato un nuovoapp.nocache.js
, il browser sembra averlo ignorato e ha continuato a utilizzare la sua copia cache!Goto Google-> GWT Compila in Eclipse. Ricompila il tutto.
- Verificare nella directory war che
app.nocache.js
sia stato sovrascritto e abbia un nuovo timestamp. - Ricarica la pagina da Chrome e verifica ancora una volta che il server abbia inviato una risposta di 200 OK allo
app.nocache.js
. - Il browser tenta ancora una volta di caricare
6E89D5C912DD8F3F806083C8AA626B83.cache.html
e ha esito negativo. Il browser sta ancora utilizzando la vecchia copia cache diapp.nocache.js
. - made assolutamente certo nella directory guerra che non si riferisce a
6E89D5C912DD8F3F806083C8AA626B83.cache.html
(via find e grep)
cosa c'è di sbagliato? Perché il browser memorizza nella cache questo file nocache.js
anche se il server lo sta inviando una nuova copia?
Ecco una copia delle intestazioni di richiesta/risposta HTTP quando si fa clic su ricarica nel browser. In questo tracciato, il contenuto del server non è stato ricompilato dall'ultimo GET (ma si noti che la versione in cache di nocache.js è ancora sbagliata!):
Request URL:http://192.168.2.4/xbts_ui/xbts_ui.nocache.js
Request Method:GET
Status Code:304 Not Modified
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:192.168.2.4
If-Modified-Since:Thu, 25 Oct 2012 17:55:26 GMT
If-None-Match:"2881105249"
Referer:http://192.168.2.4/XBTS_ui.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
Response Headersview source
Accept-Ranges:bytes
Content-Type:text/javascript
Date:Thu, 25 Oct 2012 20:27:55 GMT
ETag:"2881105249"
Last-Modified:Thu, 25 Oct 2012 17:55:26 GMT
Server:lighttpd/1.4.31
BTW, questo sembra simile a http://stackoverflow.com/questions/3407649/stop-browser-scripts-caching-in-gwt-app ma non contiene alcuna informazione che mi ha aiutato a risolvere questo problema. – jfritz42
Hai letto https://developers.google.com/web-toolkit/doc/latest/DevGuideCompilingAndDebugging#perfect_caching? –
Sì, e sembra che stia succedendo la cosa giusta, perché quella pagina dice "un recupero di If-Modified-Since è sufficiente". Posso sapere dallo strumento Chrome Inspect Element che il browser ha inviato "If-Modified-Since: Thu, 25 Oct 2012 17:03:53 GMT" nella richiesta GET e il server ha risposto con "Last-Modified: Thu, 25 Ott 2012 17:55:26 GMT " – jfritz42