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" />