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

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

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

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

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

3 ответа

Решение

Как мне написать фильтр, который будет соответствующим образом кэшировать статические ресурсы в соответствии с рекомендациями 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).

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

Написание фильтра кеша для повышения производительности статического содержимого экранов 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 UI. /questions/30024644/uluchshenie-proizvoditelnosti-jsf/30024664#30024664

Нет необходимости писать фильтр, Tomcat 7 уже имеет ExpiryFilter, который добавляет Cache-Control к вашим ресурсам. Это может быть основано на модификации или времени доступа. Смотрите этот блог:

http://kahimyang.info/kauswagan/howto_blogs/1574-improving_page_load_with_mod_expires_and_expiresfilter_in_jsf_applications

Другие вопросы по тегам