Фильтр сервлета для кеширования браузера?

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

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

Ответ 1

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

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.