включить кэширование изображений с указанием даты изменения - PullRequest
2 голосов
/ 28 января 2010

У меня есть страница JSP, которая загружает много изображений. Я хочу кэшировать изображения для более быстрой загрузки.

Я объясню мою идею, пожалуйста, исправьте ее, если она ошибочна. Я вызываю сервлет загрузки изображений для каждого изображения и возвращаю его как BLOB. Моя идея состоит в том, чтобы добавить измененную дату с изображением и другими значениями, такими как Last-Modified, expires, Cache-control и max age. И тем самым заставьте браузер понять, меняется ли изображение.

Но как я могу добавить измененную дату в BLOB? Или есть идеи получше сделать их кэшируемыми?

Спасибо ...

Ответы [ 4 ]

2 голосов
/ 28 января 2010

У меня есть страница JSP, которая загружает много изображений. Я хочу кэшировать изображения для более быстрой загрузки.

Это хорошая вещь ТМ .

Я объясню свою идею, пожалуйста, исправьте ее, если она ошибочна. Я вызываю сервлет загрузки изображений для каждого изображения и возвращаю его как BLOB. Моя идея состоит в том, чтобы добавить измененную дату с изображением и другими значениями, такими как Last-Modified, expires, Cache-control и max age. И тем самым заставьте браузер понять, меняется ли изображение.

Для этого вам на самом деле нужны заголовки ETag, Last-Modified, а также дополнительно Expires. С заголовком ETag сервер и клиент могут идентифицировать уникальный файл. Вы можете при необходимости использовать под каждым ключом базы данных для этого. С заголовком Last-Modified и сервер, и клиент знают, имеют ли они одинаковую версию файла. С помощью заголовка Expires вы можете указать клиенту, когда следует повторно запросить файл в следующий раз (таким образом, когда истек срок, указанный в Expires).

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

Для получения дополнительной информации и примера сервлета, вы можете найти эту статью полезной и, возможно, также эту статью для случая, когда вас заинтересует настройка производительности JSP / сервлета WebApplication.

Но как я могу добавить измененную дату в BLOB? Или есть идеи получше сделать их кэшируемыми?

Просто добавьте еще один столбец к рассматриваемой таблице базы данных, который представляет дату вставки. В большинстве БД вы можете просто использовать для этого функцию now() или даже создать ее как автоматический триггер, чтобы она автоматически настраивалась при каждой вставке / обновлении.

2 голосов
/ 28 января 2010

Я считаю, что вы должны установить соответствующие заголовки для контролируемого кэширования.

Вы всегда можете использовать спецификации протокола http в качестве справки для отправки и установки соответствующих заголовков (заголовков ответов).

Вы можете посмотреть по следующим ссылкам:

Кеширование в HTTP http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

Определения полей заголовка протокола HTTP http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

С уважением,

1 голос
/ 28 января 2010

(перенесено из дублирующего вопроса)

Добавить фильтр (javax.servlet.Filter), который добавляет заголовки кэша всякий раз, когда ответ содержит изображение. Что-то вроде:

public class StaticResourceCacheFilter implements Filter {

    public static final String[] CACHEABLE_CONTENT_TYPES = new String[] {
            "text/css", "text/javascript", "image/png", "image/jpeg",
            "image/gif", "image/jpg" };

    static {
        Arrays.sort(CACHEABLE_CONTENT_TYPES);
    }



    public void init(FilterConfig cfg) throws ServletException {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;


        chain.doFilter(httpRequest, httpResponse);

        String contentType = httpResponse.getContentType();

        if (contentType != null && Arrays.binarySearch(CACHEABLE_CONTENT_TYPES, contentType) > -1) {

            Calendar inTwoMonths = Calendar.getInstance();
            inTwoMonths.add(Calendar.MONTH, 2);

            httpResponse.setHeader("Expires", DateUtil.formatDate(inTwoMonths.getTime()));
        } else {
            httpResponse.setHeader("Expires", "-1");
        }

    }

(где DateUtil равно org.apache.commons.httpclient.util.DateUtil)

Вышеуказанный фильтр, конечно, предполагает, что вы установили правильное значение Content-Type для своих изображений. В противном случае я думаю, что они могут отображаться неправильно в браузере, с кешем или без него.

Чтобы ответить на ваш вопрос:

Есть ли способ сохранить изображения в кеше, пока изображение не будет изменено на сервере.

Это другой сценарий. Вы можете хранить свои изображения в некоторой реализации кеша (например, ehcache ), но это кеш сервера, а не кеш клиента.

1 голос
/ 28 января 2010

Не хотите ли вы изменить заголовки HTTP, а не собственно изображение / сам BLOB?

См. на этой странице для получения информации о настройке заголовков в ответе сервлета. Я подозреваю, что вы будете смотреть на стандартные заголовки, такие как Expires.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...