Вопрос

Сначала кэширование работало не во всех браузерах.Затем я заставил его работать во всех браузерах, кроме 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' для запрос, тогда как Safari, например, этого не делает.

Это было полезно?

Решение

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

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

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

Другие советы

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

<Ол>
  • Я не думаю, что cache является допустимой директивой Cache-Control .

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

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

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

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

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

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

    Панель управления > Свойства обозревателя > Временные интернет-файлы > Настройки > Проверить наличие новых версий сохраненных страниц

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

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

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top