Подтвердить что ты не робот

Как работает URLConnection.setUseCaches()?

У меня есть апплет, который загружает изображения через http-соединение с помощью URLConnection. Я устанавливаю setUseCaches (true) для всех подключений, но не вижу никакого поведения кэширования. У моих HTTP-заголовков изображений есть разумные настройки кеша. Если вы посмотрите на ошибка 4528599, это довольно загадочное утверждение:

Текущая версия (1.3.1) плагина Java проверяет кеш браузера для файлы, имена которых заканчиваются на .jar или .class. Мне сказали, что для Java Plug-In 1.4 кеш браузера будет проверен для следующего файла Типы:.class,.jar,.zip,.jpg,.gif,.wav,.au.

Конечно, это было отмечено как FIXED для 1.6, но даже под 1.6 я не вижу никакого кэширования. Мои изображения PNG файлов, и в некоторых случаях на самом деле не заканчиваются расширением .png. Я не вижу никакого кэширования.

В отчете об исправлении ошибок говорится о 1.6 Unified Download Engine, но google, похоже, мало что знает об этом.

Предполагается, что это сработает или это просто еще одна сломанная функция Sun. Есть ли способ или обходной путь, когда я могу заставить свой апплет загружать изображения PNG из кеша браузера? Я бы предпочел не реализовывать свои собственные...

UPDATE: кэширование, похоже, связано с реализацией ResponseCache. См. этот технот для получения дополнительной информации о том, как это работает. В последней строке говорится:

В кэшировании URLConnection по умолчанию нет реализации по умолчанию Стандартная версия Java 2. Однако Java Plugin и Java WebStart делают предоставить один из них.

Итак, мне кажется, что вопрос действительно становится: Как действительно работает реализация Java Plugin ResponseCache? Каковы различия между v1.4/v1.5/v.16

У кого-нибудь есть идеи?

4b9b3361

Ответ 1

Этот метод, скорее всего, только устанавливает директивы заголовка HTTP Cache-Control в исходящем запросе значения, которые позволяют кэшировать. Если бы вы вызвали setUseCaches (false), было бы

Cache-Control: no-cache

например. Чтобы проверить это, вы можете поместить прокси-сервер отладки HTTP между вашим апплетом и сервером и взглянуть на заголовки.

Теперь только потому, что в запросе говорится, что он хочет использовать кеши, ваш сервер не может быть настроен для их включения. Возможно, он не устанавливает заголовок Expires с соответствующим образом длинным временем ответа или, возможно, устанавливает заголовок Cache-Control в ответе, который запрещает кеширование.

Некоторые другие вещи для проверки:

  • ответы https никогда не кэшируются;
  • У вас может не быть HTTP-кеш между клиентом и сервером;
  • Единственный HTTP-кеш - кеш браузера, но он может быть отключен или настроен на использование очень маленького диска.

Если это всего лишь браузер ванили для тестирования веб-приложений, вы также должны убедиться, что не нажали кнопку обновления, поскольку это эквивалентно настройке no-cache.

Ответ 2

Абстрактный класс URLConnection предоставляет методы set/getUseCaches, которые могут использоваться любыми подклассами. Однако, поскольку я когда-либо мог определить, класс HttpURLConnection не использует эти поля каким-либо образом. Установка значения true или false не будет иметь никакого другого поведения.

Если вы хотите добавить поведение кэширования HTTP, вы можете либо сделать это самостоятельно (написать свой собственный, либо расширить HttpURLConnector, либо использовать Sockets), либо попытаться использовать If-Modified-Since и If-None-Match и найдите код состояния 304 (не изменен). Второй вариант, вероятно, самый простой и даст вам наилучшие результаты.