Опираясь на ответ от Тима Barclay, я создал фильтр, который устанавливает Cache-Control
и Expires
один год в будущем, если ресурс запрашивается, является файл с расширением js, css, png, jpg, gif или svg. В противном случае кеш отключается.
Надеюсь, это может быть полезно для кого-то!
protected void setCacheHeaders(Environment environment, String urlPattern, int seconds) {
FilterRegistration.Dynamic filter = environment.servlets().addFilter(
"cacheControlFilter",
new Filter() {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
String[] cacheFileTypes = {"js","css","png","jpg","gif","svg"};
String filetypeRequested = FilenameUtils.getExtension(httpServletRequest.getRequestURL().toString());
if (httpServletRequest.getMethod() == "GET" && seconds > 0 && Arrays.asList(cacheFileTypes).contains(filetypeRequested)) {
httpServletResponse.setHeader("Cache-Control", "public, max-age=" + seconds);
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.SECOND, seconds);
SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
httpServletResponse.setHeader("Expires", format.format(c.getTime()));
} else {
httpServletResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
httpServletResponse.setHeader("Expires", "0");
httpServletResponse.setHeader("Pragma", "no-cache");
}
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
);
filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, urlPattern);
}
PS: Я не мог так принято отвечать, чтобы установить Expires
-header работать:
resp.setHeader("Expires", new Date().getTime()+500000 + "");
Шахта ужасно раздутой в сравнении, но она работает:
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.SECOND, seconds);
SimpleDateFormat format = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
httpServletResponse.setHeader("Expires", format.format(c.getTime()));
Основываясь на комментарии от @Rich о моем ответе, похоже, возможно, что я предложил больше не работать с текущими версиями Dropwizard. использовал его (или Java вообще на самом деле) с 2014 года, поэтому я не могу проверить. –