« Return to Thread: StaticFilter works on Tomcat, not on Jetty

Re: StaticFilter works on Tomcat, not on Jetty

by mraible :: Rate this Message:

Reply to Author | View in Thread

I 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

mraible wrote:
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

 « Return to Thread: StaticFilter works on Tomcat, not on Jetty