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

Glassfish 3.1.2, Мохарра 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 справиться.

Что касается управления версиями, просто используйте библиотеки ресурсов правильно. Вы можете поместить папку версии, соответствующую шаблону регулярных выражений \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" />
Другие вопросы по тегам