Based on Tim Barclayβs answer, I created a filter that sets Cache-Control and Expires one year in the future, if the requested resource is a file with the extension js, css, png, jpg, gif or svg, otherwise the cache is disabled.
Hope this can be helpful for someone!
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: I could not get an acceptable answer method to install Expires -header:
resp.setHeader("Expires", new Date().getTime()+500000 + "");
Mine is badly bloated in comparison, but it works:
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()));