From 2debc69d4dcf8618c2fc06aa0633fabbf4f98f52 Mon Sep 17 00:00:00 2001 From: Kai Moritz Date: Sat, 2 Jun 2012 23:29:55 +0200 Subject: [PATCH] Fehler durch mehrfaches Mappen des AcceleratorFilters auf ein URI behandelt MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Wenn die selbe Filter-Instanz mehrfach auf eine URL gemappt ist, wird eine Warnung ausgegeben und ein doppeltes Wrapping der HttpServletResponse verhindert, weil das zu Fehlern führen würde. Wenn unterschiedliche Filter-Instanzen auf die selbe URL gemappt sind, wird ein 500er-Fehler erzeugt, da das mehrfache Wrapping der HttpServletResponse sonst zu unkalkulierbaren Fehlern führen würde. --- .../juplo/cachecontrol/AcceleratorFilter.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/AcceleratorFilter.java b/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/AcceleratorFilter.java index e881a8ed..8e63222a 100644 --- a/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/AcceleratorFilter.java +++ b/cachecontrol/src/main/java/de/halbekunst/juplo/cachecontrol/AcceleratorFilter.java @@ -64,7 +64,25 @@ public class AcceleratorFilter implements Filter { HttpServletRequest httpRequest = (HttpServletRequest)request; HttpServletResponse httpResponse = (HttpServletResponse)response; - AccelerationWrapper wrapper = new AccelerationWrapper(httpRequest, httpResponse); + + AccelerationWrapper wrapper; + + wrapper = (AccelerationWrapper)request.getAttribute(AcceleratorFilter.RESPONSE_WRAPPER); + if (wrapper != null) { + if (wrapper.getFilter() == this) { + /** Ignore multiple mappings of the same filter-instance */ + log.warn("Ignoring multiple mappings on same URL: {}", httpRequest.getRequestURI()); + chain.doFilter(request, response); + return; + } + else { + log.error("Only one instance of AcceleratorFilter must be mapped to any URL: {}", httpRequest.getRequestURI()); + httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Only one instance of AcceleratorFilter must be mapped to any URL!"); + return; + } + } + + wrapper = new AccelerationWrapper(httpRequest, httpResponse); httpRequest.setAttribute(RESPONSE_WRAPPER, wrapper); cacheControl.init(wrapper); try { @@ -143,6 +161,10 @@ public class AcceleratorFilter implements Filter { } + private AcceleratorFilter getFilter() { + return AcceleratorFilter.this; + } + private void finish() throws IOException { flushBuffer(); out.close(); -- 2.20.1