From bf9295bec38b80b82b9aaca3e6ea8a9496aca5c5 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 6 Nov 2014 22:48:08 +0100 Subject: [PATCH] ShallowEtagHeaderFilter skips "Cache-Control" header check on Servlet 2.5 Issue: SPR-12414 --- .../web/filter/ShallowEtagHeaderFilter.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/web/filter/ShallowEtagHeaderFilter.java b/spring-web/src/main/java/org/springframework/web/filter/ShallowEtagHeaderFilter.java index 0043f85fe9..738d1b8734 100644 --- a/spring-web/src/main/java/org/springframework/web/filter/ShallowEtagHeaderFilter.java +++ b/spring-web/src/main/java/org/springframework/web/filter/ShallowEtagHeaderFilter.java @@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletResponseWrapper; import org.springframework.http.HttpMethod; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; import org.springframework.util.DigestUtils; import org.springframework.util.ResizableByteArrayOutputStream; import org.springframework.util.StreamUtils; @@ -60,6 +61,11 @@ public class ShallowEtagHeaderFilter extends OncePerRequestFilter { private static final String DIRECTIVE_NO_STORE = "no-store"; + /** Checking for Servlet 3.0+ HttpServletResponse.getHeader(String) */ + private static final boolean responseGetHeaderAvailable = + ClassUtils.hasMethod(HttpServletResponse.class, "getHeader", String.class); + + /** * The default value is "false" so that the filter may delay the generation of * an ETag until the last asynchronously dispatched thread. @@ -150,7 +156,7 @@ public class ShallowEtagHeaderFilter extends OncePerRequestFilter { if (responseStatusCode >= 200 && responseStatusCode < 300 && HttpMethod.GET.name().equals(request.getMethod())) { - String cacheControl = response.getHeader(HEADER_CACHE_CONTROL); + String cacheControl = (responseGetHeaderAvailable ? response.getHeader(HEADER_CACHE_CONTROL) : null); if (cacheControl == null || !cacheControl.contains(DIRECTIVE_NO_STORE)) { return true; }