|
View:
New views
2 Messages
—
Rating Filter:
Alert me
|
|
|
StaticFilter works on Tomcat, not on JettyI'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 |
|
|
Re: StaticFilter works on Tomcat, not on JettyI was able to fix this problem by explicitly setting the contentType to "text/html". Canoo WebTest seemed to detect this issue - happens on Tomcat too, but it seems to get decorated anyway.
http://tinyurl.com/22p9gu Matt
|
| Free embeddable forum powered by Nabble | Forum Help |