From 6f9099ff5066e536b1fe31315be1b0245579d348 Mon Sep 17 00:00:00 2001 From: Graham McGregor Date: Fri, 24 Mar 2017 13:56:16 -0400 Subject: [PATCH] Allow specificying extensions to exclude I want to apply this filter to a subfolder (like /static/), and exclude certain file types (like .html). Tomcat has very limited url pattern matching available which doesn't let me do this. --- .../java/com/samaxes/filter/CacheFilter.java | 29 +++++++++++++++++++ .../filter/util/CacheConfigParameter.java | 9 +++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/samaxes/filter/CacheFilter.java b/src/main/java/com/samaxes/filter/CacheFilter.java index a7ae1be..443b63c 100644 --- a/src/main/java/com/samaxes/filter/CacheFilter.java +++ b/src/main/java/com/samaxes/filter/CacheFilter.java @@ -19,6 +19,11 @@ package com.samaxes.filter; import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collector; +import java.util.stream.Collectors; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -26,6 +31,7 @@ import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; @@ -177,6 +183,8 @@ public class CacheFilter implements Filter { private String vary; + private List excludeExtensions; + /** * {@inheritDoc} */ @@ -194,6 +202,14 @@ public void init(FilterConfig filterConfig) throws ServletException { : Cacheability.PUBLIC; mustRevalidate = Boolean.valueOf(filterConfig.getInitParameter(CacheConfigParameter.MUST_REVALIDATE.getName())); vary = filterConfig.getInitParameter(CacheConfigParameter.VARY.getName()); + excludeExtensions = Arrays.stream( + Optional.ofNullable( + filterConfig.getInitParameter(CacheConfigParameter.EXCLUDE_EXTENSIONS.getName())) + .orElse("") + .split(" ") + ) + .filter(ext -> !ext.isEmpty()) + .collect(Collectors.toList()); } /** @@ -205,6 +221,19 @@ public void init(FilterConfig filterConfig) throws ServletException { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + // If extensions provided filter on them + if (!excludeExtensions.isEmpty()) { + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + String uri = httpServletRequest.getRequestURI(); + String ext = uri.substring(uri.lastIndexOf(".")); + // if found, continue filter chain and skip our the rest of our cache filter + if (excludeExtensions.contains(ext)) { + filterChain.doFilter(servletRequest, servletResponse); + return; + } + } + + HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; StringBuilder cacheControl = new StringBuilder(cacheability.getValue()).append(", max-age=").append(expiration); if (mustRevalidate) { diff --git a/src/main/java/com/samaxes/filter/util/CacheConfigParameter.java b/src/main/java/com/samaxes/filter/util/CacheConfigParameter.java index 636ee5f..a31429d 100644 --- a/src/main/java/com/samaxes/filter/util/CacheConfigParameter.java +++ b/src/main/java/com/samaxes/filter/util/CacheConfigParameter.java @@ -42,7 +42,14 @@ public enum CacheConfigParameter { * Cache directive to instructs proxies to cache different versions of the same resource based on specific * request-header fields. */ - VARY("vary"); + VARY("vary"), + /** + * Cache directive to define any file extensions that should be ignored. Expect a space delimited list. + * + * Example: .html .map .xyz + */ + EXCLUDE_EXTENSIONS("exclude-extensions"), + ; private final String name;