I've mentioned this issue before regarding a GZIPFilter that wasn't working under Tomcat except for static file content (not working for JSP's and servlets). However, I didn't get much response to that and it was probably due to the complexity of the problem. Well, here is a simplied approach to the issue....


I am seeing vastly differing behavior for this filter depending on whether it is filtering static content or JSP's and servlets and it seems to me that this differing behavior must be a bug in Tomcat. Can someone validate whether or not this is a Tomcat bug?

Here is the code in question. Note that I have some comments in the code that explain what works, what doesn't so read that to get an idea of what I am talking about. I have attached all the code in question, but this is the meat of it (based on the tutorial at http://www.orionserver.com/tutorials/filters/3.html ).

public class PrePostFilter extends GenericFilter {

    public void doFilter(final ServletRequest request,
                         final ServletResponse response,
                         FilterChain chain)
                                throws IOException, ServletException {

PrintWriter out = response.getWriter();

//works as expected for static html, but not for JSP's where original content is discarded
//GenericResponseWrapper wrapper = new GenericResponseWrapper((HttpServletResponse) response);


//works as expected for both static html and JSP's
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);


        chain.doFilter(request, wrapper);
        String responseString = wrapper.toString();
        responseString = "<HR>PRE<HR>" + responseString + "<HR>POST<HR>";
        response.setContentLength(responseString.length());
        out.write(responseString);

/*
//works as expected for JSP's, but not static html where everything but the "POST" data is written
out.write("<HR>PRE<HR>");
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, wrapper);
out.write(wrapper.toString());
out.write("<HR>POST<HR>");
*/


        out.flush();
        out.close();
    }

}

Questions to answer...

1. Why don't all 3 examples produce exactly the same output? It seems to me that they should.
2. Why does using a response wrapper that uses a ByteArrayOutputStream (as in GenericResponseWrapper) not work with JSP's? The original data is always unavailable.
3. Why do I have to use a PrintWriter when filtering JSP's? Why can't I use an OutputStream? Using an OutputStream gets me the same results as #2.


So, is there anything wrong with my code or is something just goofy in Tomcat?

Jake


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to