JSF2 Статическое кэширование ресурсов

Glassfish 3.1.2, Mojarra 2.1.6, активированный SSL

У меня вопрос о статическом кэшировании ресурсов. Я прочитал несколько сообщений об этом, но я не знаю, какие варианты мы должны использовать. Это

https://developers.google.com/speed/docs/best-practices/caching

также является хорошей статьей о кэшировании ресурсов. В нашем сервере приложений активируется SSL. Мы видим, что статические ресурсы (изображения, скрипты, css) не кэшируются.

Вот мой тестовый фильтр:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String uri = httpRequest.getRequestURI();
        if (GET_METHOD.equalsIgnoreCase(httpRequest.getMethod()) && uri.contains(ResourceHandler.RESOURCE_IDENTIFIER)) {
            httpResponse.setDateHeader("Expires", System.currentTimeMillis() + 2419200000L); // 1 month in future.
            httpResponse.setDateHeader("Last-Modified", System.currentTimeMillis() - 2419200000L); // 1 month in past.
            httpResponse.setHeader("Cache-Control", "public"); // Secure caching
        }
    }
    chain.doFilter(request, response);
}
  • Истекает: Хорошо. Это статический ресурс, который не меняется, поэтому мы устанавливаем дату истечения срока действия в будущем.
  • Последнее изменение: Не уверен. Я читал, что установка этого в прошлое также распространяется на кеширование
  • Cache-Control: Хорошо. Разрешить безопасное кэширование. Последствия безопасности?

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

Ответ 1

Вам нужно установить Cache-Control. Expires и Last-Modified уже установлены по умолчанию ResourceHandler (и будут отменять значения, установленные вашим фильтром). Last-Modified должен представлять последнюю измененную метку времени рассматриваемого ресурса. Вы можете получить его servletContext.getResource(path).openConnection().getLastModified(). Но вам все равно не нужно его устанавливать. Просто отпустите ResourceHandler.

Что касается управления версиями, просто используйте библиотеки ресурсов правильно. Вы можете поместить папку с версией, соответствующую шаблону regex \d+(_\d+)* в папке библиотеки, а ResourceHandler будет обслуживать самые новые.

например.

/resources/libraryname/1_0/js/file.js
/resources/libraryname/1_1/js/file.js
/resources/libraryname/1_2/js/file.js

Далее будет получен символ из 1_2:

<h:outputScript library="libraryname" name="js/file.js" />