From: Kai Moritz Date: Sat, 2 Jun 2012 21:29:55 +0000 (+0200) Subject: Fehler durch mehrfaches Mappen des AcceleratorFilters auf ein URI behandelt X-Git-Url: http://juplo.de/gitweb/?a=commitdiff_plain;h=2debc69d4dcf8618c2fc06aa0633fabbf4f98f52;p=percentcodec Fehler durch mehrfaches Mappen des AcceleratorFilters auf ein URI behandelt 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. --- 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();