Включить кеширование PDF в IE - PullRequest
2 голосов
/ 27 ноября 2009

Сначала кэширование работало не во всех браузерах. Затем я заставил его работать во всех браузерах, кроме IE (IE8), добавив расширение .pdf к URL. Сервлет перестал вызываться после этого.

Я отображаю PDF-файл на веб-странице через тег EMBED, который загружает следующий URL:

http://localhost:7001/app/viewFile.pdf

Который генерируется Java-сервлетом со следующими заголовками:

response.addHeader("Content-Disposition", "inline;");
response.setHeader("Cache-control", "cache,max-age=600");
response.setContentType(mimeType);
response.setContentLength(contentLength);

Для отображения PDF во всех браузерах я использую Adobe Reader 9.2.0.

Как заставить это работать в IE тоже? Я заметил, что IE добавляет заголовок «Cache-Control: no-cache» к request , тогда как Safari, к примеру, этого не делает.

Ответы [ 3 ]

1 голос
/ 04 декабря 2009

Некоторые идеи для изучения:

  1. Я не думаю, что cache является действительной директивой Cache-Control.

    Попробуйте вместо этого использовать значение public или private, если оно больше подходит для вашего контента. Проверьте RFC 2616 для получения дополнительной информации.

  2. Возможно, вы отправляете более одного Cache-Control директива?

    Используйте инструмент как Firebug или LiveHTTPHeaders , чтобы посмотреть на фактические заголовки ваших браузеров получение. Убедитесь, что они не получить то, что вы не ожидаете. Похоже, вы уже делаю это все же. Также убедитесь, что вы также не отправляете Pragma: no-cache.

  3. Попробуйте установить Expires заголовок в дополнение к использованию Cache-Control.

    Это также возможно вы отправляете браузер конфликтующие Cache-Control / Pragma Заголовки и IE выбирает взять Pragma Заголовки как первоочередные по любой обратной причине.

  4. Убедитесь, что IE настроен на кэширование! :)

    Control Panel> Internet Options> Temporary Internet Files> Settings> Check for newer versions of stored pages

  5. Попробуйте отправить PDF-файл в ответ на запрос POST (с помощью отправки формы).

    IE разрешает кэширование независимо от заголовков в ответе из-за этого требования из RFC 2616 : «По умолчанию, ответ кешируется, если требования метода запроса, заголовок запроса поля, и статус ответа указывают на то, что он кешируется. " Ответы на POST запросов НЕ кэшируются, поэтому IE не должен включать этот заголовок в свой запрос.

  6. Попробуйте отправить заголовки Content-MD5 и Last-Modified с постоянными значениями (если они еще не отправлены).

    Это может помочь убедить IE, что содержание PDF не изменилось. Я не думаю, что это решение будет работать, потому что IE явно упрямый, но стоит упомянуть.

1 голос
/ 05 декабря 2009

Как уже было сказано, значение заголовка cache-control cache недопустимо. Вместо этого используйте public.

Что касается IE, не соблюдающего правила управления кэшем на стороне сервера в элементах embed и object, то это, к сожалению, "особенность" IE. Лучшее, что вы можете сделать, это заменить его элементом iframe.

Другие заголовки, такие как expires, last-modified, etag и т. Д., Не помогут.

0 голосов
/ 02 декабря 2009

Что ж, одним из очевидных способов решения этой проблемы является использование перезаписи URL. Если IE работает с расширением .pdf в расширении, используйте mod_rewrite (Apache) или аналогичный инструмент для перенаправления на нужную страницу на стороне сервера, в то же время заставляя клиента думать, что он действительно запрашивает файл PDF.

Также: просмотрите заголовки HTTP, которые получает клиент, используя такой инструмент, как Fiddler.

Также: просмотрите этот старый вопрос ( PHP: принудительная загрузка файлов и IE, но опять же ), у меня были похожие проблемы с IE, также не заставляющим скачивать.

...