Abilita la memorizzazione nella cache pdf in IE
-
05-07-2019 - |
Domanda
Inizialmente, la memorizzazione nella cache non funzionava in tutti i browser. Poi l'ho fatto funzionare in tutti i browser tranne IE (IE8) aggiungendo l'estensione .pdf all'URL. Dopo di ciò, Servlet ha smesso di essere chiamato.
Visualizzo il file pdf in linea sulla pagina web tramite il tag EMBED che carica il seguente URL:
http://localhost:7001/app/viewFile.pdf
Che viene generato dal servlet java con le seguenti intestazioni:
response.addHeader("Content-Disposition", "inline;");
response.setHeader("Cache-control", "cache,max-age=600");
response.setContentType(mimeType);
response.setContentLength(contentLength);
Per la visualizzazione di pdf in tutti i browser utilizzo Adobe Reader 9.2.0.
Come farlo funzionare anche in IE? Ho notato che IE aggiunge l'intestazione "Cache-Control: no-cache" a richiesta , mentre Safari, ad esempio, non lo fa.
Soluzione
Come detto prima, il cache-control
il valore dell'intestazione cache
non è valido. Utilizzare invece public
.
Per quanto riguarda IE che non aderisce alle regole di controllo della cache sul lato server negli elementi embed
e object
, questa è purtroppo una "caratteristica" di IE. La cosa migliore che puoi fare è sostituirlo con un elemento iframe
.
Altre intestazioni come scade
, ultima modifica
, etag
e così via non funzioneranno.
Altri suggerimenti
Alcune idee da esaminare:
-
Non credo che
cache
sia una direttivaCache-Control
valida.Prova invece a utilizzare un valore di
public
oprivate
se è più appropriato ai tuoi contenuti. Per ulteriori informazioni, consulta RFC 2616 per ulteriori informazioni. -
Forse ne stai inviando più di uno Direttiva
Cache-Control
?Usa uno strumento come Firebug o LiveHTTPHeaders per dare un'occhiata al intestazioni effettive dei tuoi browser ricevente. Assicurati che non lo siano ottenere qualcosa che non ti aspetti. Sembra che potresti già esserlo facendo questo però. Assicurati anche di non inviare
Pragma: no-cache
. -
Prova a impostare il
Scade
oltre all'utilizzo dell'intestazioneCache-Control
.È anche possibile stai inviando il browser
Cache-Control
/Pragma
in conflitto headers e IE scelgono di prendere il file Le intestazioniPragma
come prima priorità per qualunque motivo arretrato. -
Assicurati che IE sia configurato per consentire la memorizzazione nella cache! :)
Pannello di controllo
>Opzioni Internet
>File temporanei Internet
>Impostazioni
>Controlla le versioni più recenti delle pagine memorizzate
-
Prova a inviare il PDF come risposta a una richiesta
POST
(tramite l'invio del modulo).IE consente l'esecuzione di una cache indipendentemente dalle intestazioni nella risposta a causa di questo requisito da RFC 2616 : " Per impostazione predefinita, una risposta è memorizzabile nella cache se i requisiti del metodo di richiesta, i campi di intestazione della richiesta, e lo stato della risposta indicano che è memorizzabile nella cache. " Le risposte alle richieste
POST
NON sono memorizzabili nella cache, quindi IE non dovrebbe includere quell'intestazione nella sua richiesta. -
Prova a inviare le intestazioni
Content-MD5
eLast-Modified
con valori coerenti (se non sono già stati inviati).Questo potrebbe aiutare a convincere IE che il contenuto del PDF non è cambiato. Non credo che questa soluzione funzionerà, perché IE è ovviamente testardo, ma vale la pena menzionarlo.
Bene, un modo ovvio per aggirare il problema è usare la riscrittura degli URL. Se IE funziona con .pdf nell'estensione, utilizzare mod_rewrite (Apache) o uno strumento simile per reindirizzare sul lato server alla pagina giusta, facendo in modo che il client pensi che stia effettivamente richiedendo un file PDF.
Inoltre: rivedi le intestazioni HTTP che il client sta ricevendo usando uno strumento come Fiddler.
Inoltre: rivedi questa domanda precedente ( PHP: imponi il download di file e IE, ancora una volta ), ho avuto problemi simili con IE non forzando i download.