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.

È stato utile?

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:

  1. Non credo che cache sia una direttiva Cache-Control valida.

    Prova invece a utilizzare un valore di public o private se è più appropriato ai tuoi contenuti. Per ulteriori informazioni, consulta RFC 2616 per ulteriori informazioni.

  2. 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 .

  3. Prova a impostare il Scade oltre all'utilizzo dell'intestazione Cache-Control .

    È anche possibile stai inviando il browser Cache-Control / Pragma in conflitto headers e IE scelgono di prendere il file Le intestazioni Pragma come prima priorità per qualunque motivo arretrato.

  4. 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

  5. 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.

  6. Prova a inviare le intestazioni Content-MD5 e Last-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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top