Фильтр статических ресурсов кеша JSF

Как написать фильтр, который будет соответствующим образом кэшировать статические ресурсы, как рекомендовано Google (https://developers.google.com/speed/docs/best-practices/caching).

Достаточно ли создать фильтр, который устанавливает дату последнего изменения на какую-либо статическую дату (это будет меняться при каждом перезапуске сервера)?

Важно указать один из Max-age Expires или Cache-Control, и один из Last-Modified или ETag для всех кэшируемых ресурсов. это избыточным, чтобы указать как Expires, так и Cache-Control: максимальный возраст или укажите как Last-Modified, так и ETag.

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

Ответ 1

Как написать фильтр, который будет соответствующим образом кэшировать статические ресурсы, как рекомендовано Google

Если вы имеете в виду с ресурсами JSF файлы в папке /resources, которые полностью обрабатываются встроенным обработчиком ресурсов JSF ( и, следовательно, все ссылки на них <h:outputStylesheet>, <h:outputScript>, <h:graphicImage>, #{resource} и, следовательно, не с помощью простого способа HTML), тогда вам не нужно делать домашнее задание фильтра для задания. Единственное, что вам нужно сделать, чтобы удовлетворить рекомендации Google, - это установить дату Expires немного дальше в будущем. Это по умолчанию составляет 7 дней (604800000 миллисекунд), в то время как инструменты тестирования производительности, такие как Google Page Speed ​​и Yahoo YSlow, рекомендуют минимум 30 дней (2592000000 миллисекунд).

В Mojarra вы можете установить его со следующим параметром контекста в web.xml:

<context-param>
    <param-name>com.sun.faces.defaultResourceMaxAge</param-name>
    <param-value>2592000000</param-value> <!-- 30 days -->  
</context-param>

И в MyFaces со следующим:

<context-param>
    <param-name>org.apache.myfaces.RESOURCE_MAX_TIME_EXPIRES</param-name>
    <param-value>2592000000</param-value> <!-- 30 days -->  
</context-param>

Достаточно ли создать фильтр, который устанавливает дату последнего изменения на какую-либо статическую дату (это будет меняться каждый раз, когда сервер перезагрузится)?

Вам не нужно и не нужно устанавливать Last-Modified. Обработчик ресурсов JSF уже делает это автоматически. Если вы хотите принудительно перезагрузить ресурсы, потому что вы их изменили, используйте управление версиями библиотеки ресурсов. См. Также Какова библиотека ресурсов JSF и как ее использовать?

Обратите внимание, что изменение его каждый раз, когда перезапуск сервера не имеет смысла, поскольку заголовок Expires все равно будет продолжать повторять проверку подлинности кеша через определенный период времени. Пока браузер не запрашивает ресурс, браузер никогда не заметит изменения в Last-Modified ресурса. Единственное, что заставляет браузер сильно повторно запрашивать ресурс, это изменение URL-адреса, обычно достигаемое измененным значением параметра строки запроса. Реализация библиотеки библиотек ресурсов JSF делает именно это.

Также обратите внимание, что OmniFaces CombinedResourceHandler использует последнюю измененную временную метку ресурса как "версию ресурса" в строке запроса вместо ресурса библиотека версия. Поэтому, если вы используете это, вам не обязательно нужен механизм управления версиями библиотеки ресурсов.


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

Заголовок Expires сообщает браузеру, когда он повторно проверяет достоверность кэшированного ресурса условным запросом GET. Таким образом, до этого времени браузер не будет этого делать и будет продолжать использовать тот, который находится в кеше. Cache-Control сообщает браузеру, какую стратегию кеширования использовать. Обратите внимание, что когда он установлен, например, no-cache вместо public, то заголовок Expires не будет иметь никакого эффекта. Также обратите внимание, что отсутствие заголовка Cache-Control подразумевает public (как это делают ресурсы JSF).

Ответ 2

Вот как я написал свой кеш-фильтр. работает как шарм.

Написание фильтра кэша для повышения производительности статического содержимого экранов JSF/Servlet

Добавьте в свой web.xml следующий текст

<filter>
    <filter-name>cache</filter-name>
    <filter-class>au.com.webapp.config.CacheFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>cache</filter-name>
    <url-pattern>*.xhtml</url-pattern>
</filter-mapping>

В вашем пакете au.com.webapp.config создайте класс CacheFilter следующим образом:

package au.com.webapp.config;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CacheFilter implements Filter {
    private static long maxAge = 86400 * 30; // 30 days in seconds

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String uri = ((HttpServletRequest) request).getRequestURI();
        if (uri.contains(".js") || uri.contains(".css") || uri.contains(".svg") || uri.contains(".gif")
                || uri.contains(".woff") || uri.contains(".png")) {
            httpResponse.setHeader("Cache-Control", "max-age=" + maxAge);
        }
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Cache Filter started: ");

    }

    @Override
    public void destroy() {
    }
}

Как проверить, использует ли мой экран кеш

Чтобы узнать, уже ли ваше содержимое уже используется в gzip и кеше, в браузере Google Chrome - щелкните правой кнопкой мыши на экране → проверьте → нажмите вкладку сети → обновите экран. Нажмите на изображения, значки, таблицы стилей и посмотрите, видите ли вы следующее в заголовке ответа

Cache-Control:max-age=2592000

Также, когда вы обновляете страницу, если статус элемента равен 304 вместо 200 (из кеша), вы сделали.

Другие улучшения производительности, такие как gzip

Обратитесь к следующей ссылке за дополнительными простыми улучшениями производительности, которые могут значительно улучшить производительность веб-сайта или веб-сайта, например, компоненты интерфейса gzip или JQuery. fooobar.com/questions/9320/...