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

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

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

11
задан BalusC 30 July 2010 в 20:19
поделиться

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.

17
ответ дан 3 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: