Фильтр сервлетов для кэширования в браузере? - PullRequest
11 голосов
/ 30 июля 2010

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

Кто-нибудь знает, как это сделать? Или, что еще лучше, есть пример кода, которым они хотели бы поделиться? Спасибо!

Ответы [ 2 ]

17 голосов
/ 30 июля 2010

В вашем фильтре есть эта строка:

chain.doFilter(httpRequest, new AddExpiresHeaderResponse(httpResponse));

Где оболочка ответа выглядит так:

class AddExpiresHeaderResponse extends HttpServletResponseWrapper {

    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 AddExpiresHeaderResponse(HttpServletResponse response) {
        super(response);
    }

    @Override
    public void setContentType(String contentType) {
        if (contentType != null && Arrays.binarySearch(CACHEABLE_CONTENT_TYPES, contentType) > -1) {
            Calendar inTwoMonths = GeneralUtils.createCalendar();
            inTwoMonths.add(Calendar.MONTH, 2);

            super.setDateHeader("Expires", inTwoMonths.getTimeInMillis());
        } else {
            super.setHeader("Expires", "-1");
            super.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        }
        super.setContentType(contentType);
    }
}

Короче говоря, это создает оболочку ответа, которая при настройке типа контента добавляет заголовок expires. (Если вы хотите, вы можете добавить любые другие заголовки, которые вам нужны). Я использовал этот фильтр + упаковщик, и он работает.

См. Этот вопрос об одной конкретной проблеме, которую это решает, и об оригинальном решении BalusC.

0 голосов
/ 24 февраля 2015

Вот готовое решение для этого https://github.com/samaxes/javaee-cache-filter

...