StaticFilter works on Tomcat, not on Jetty
I'm using Maven 2.0.6, JDK 5, maven-jetty-plugin 6.0.0, Tomcat 5.5.23 with Cargo 0.3.
I have a Struts 2 application with the Struts Filter mapped to /* and actions mapped to .html. I have a StaticFilter I wrote to serve up static content (i.e. from Dojo templates and help files). I was using requestDispatcher.forward(), to serve up static content, but that only works if I don't do any forwards to Struts Actions. So I've changed my StaticFilter to use requestDispatcher.include() and changed my Struts Filter to only filter on REQUEST and FORWARD (not include). This works as I want it to, but SiteMesh fails to decorate the static file when it's included. This lack-of-decoration only happens with Jetty 6.0.0 (used via the Maven plugin). If I use Tomcat 5.5.23, the file is decorated. The strange thing is that Tomcat decorates it regardless of whether I add INCLUDE to my SiteMesh filter.
Any ideas?
My StaticFilter code is below:
package org.appfuse.webapp.filter;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.PatternMatchUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.UrlPathHelper;
import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
/**
* A simple filter that allows the application to continue using the .html prefix for actions but also allows
* static files to be served up with the same extension. Dojo to serve up its HTML template code. The filter works
* on an include/exclude basis where all requests for active pages are redirected by the filter to thee dispatch
* servlet. All Dojo related .html requests are allowed to pass straight through to be processed by the servlet
* container as per normal.
*/
public class StaticFilter extends OncePerRequestFilter {
private final static String DEFAULT_INCLUDES = "*.html";
private final static String DEFAULT_EXCLUDES = "";
private static final String INCLUDES_PARAMETER = "includes";
private static final String EXCLUDES_PARAMETER = "excludes";
private static final String SERVLETNAME_PARAMETER = "servletName";
private String[] excludes;
private String[] includes;
private String servletName = null;
/**
* Read the includes/excludes paramters and set the filter accordingly.
*/
public void initFilterBean() {
String includesParam = getFilterConfig().getInitParameter(INCLUDES_PARAMETER);
if (StringUtils.isEmpty(includesParam)) {
includes = parsePatterns(DEFAULT_INCLUDES);
} else {
includes = parsePatterns(includesParam);
}
String excludesParam = getFilterConfig().getInitParameter(EXCLUDES_PARAMETER);
if (StringUtils.isEmpty(excludesParam)) {
excludes = parsePatterns(DEFAULT_EXCLUDES);
} else {
excludes = parsePatterns(excludesParam);
}
// if servletName is specified, set it
servletName = getFilterConfig().getInitParameter(SERVLETNAME_PARAMETER);
}
private String[] parsePatterns(String delimitedPatterns) {
//make sure no patterns are repeated.
Set patternSet = org.springframework.util.StringUtils.commaDelimitedListToSet(delimitedPatterns);
String[] patterns = new String[patternSet.size()];
int i = 0;
for (Iterator iterator = patternSet.iterator(); iterator.hasNext(); i++) {
//no trailing/leading white space.
String pattern = (String) iterator.next();
patterns[i] = pattern.trim();
}
return patterns;
}
/**
* This method checks to see if the current path matches includes or excludes. If it matches includes and
* not excludes, it forwards to the static resource and ends the filter chain. Otherwise, it forwards to the
* next filter in the chain.
*
* @param request the current request
* @param response the current response
* @param chain the filter chain
* @throws IOException
* @throws ServletException
*/
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws IOException, ServletException {
UrlPathHelper urlPathHelper = new UrlPathHelper();
String path = urlPathHelper.getPathWithinApplication(request);
boolean pathExcluded = PatternMatchUtils.simpleMatch(excludes, path);
boolean pathIncluded = PatternMatchUtils.simpleMatch(includes, path);
if (pathIncluded && !pathExcluded) {
if (logger.isDebugEnabled()) {
logger.debug("Forwarding to static resource: " + path);
}
RequestDispatcher rd = getServletContext().getRequestDispatcher(path);
rd.include(request, response);
return;
}
if (servletName != null) {
RequestDispatcher rd = getServletContext().getNamedDispatcher(servletName);
rd.forward(request, response);
return;
}
chain.doFilter(request, response);
}
}
Thanks,
Matt