Hi,
We are running Tomcat 6. 0.32 with jdk1.6.0_26 on Solaris 10, mod_ajp and Apache 2.2.21 in our production environment and are looking to upgrade to Tomcat 7 but have run into a problem with the CompressionFilter (an older version of the Amy Roh one) causing this exception: SEVERE: Servlet.service() for servlet [jsp] in context with path [] threw exception [java.lang.IllegalStateException: getWriter() has already been called for this response] with root cause java.lang.IllegalStateException: getWriter() has already been called for this response at org.apache.catalina.connector.Response.getOutputStream(Response.java:594) at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:199) at com.tirerack.filters.CompressionResponseStream.<init>(CompressionResponseStream.java:47) at com.tirerack.filters.CompressionServletResponseWrapper.createOutputStream(CompressionServletResponseWrapper.java:172) at com.tirerack.filters.CompressionServletResponseWrapper.getWriter(CompressionServletResponseWrapper.java:250) at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:190) at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:123) at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80) at org.apache.jsp.upgrade_005fgarage.SetCurrentVehicle_jsp._jspService(SetCurrentVehicle_jsp.java:278) These appear to occur when the "response.sendRedirect("/page.jsp")" is used on a JSP. The error is caught and handled so the customer doesn't notice it and is still redirected, but it sure generates a ton of log entries and I'd like to get it fixed before proceeding with our upgrade. I saw that another user had trouble (copied post snippet below for reference) with the new flushBuffer() call that was added to the Response.java for sendRedirect() in 7.0.21 and I'm guessing that's the issue here, too, but I'm not sure how to get around it. >From what I've read, you can only use a getWriter or a getOutputStream on a >single response object, not both, and I think this error is happening because >the flushBuffer() method that was added is invoking the getWriter on line 118 >(http://www.docjar.com/html/api/org/apache/jasper/runtime/JspWriterImpl.java.html) > when an output stream was already being used: 111 protected final void flushBuffer() throws IOException { 112 if (bufferSize == 0) 113 return; 114 flushed = true; 115 ensureOpen(); 116 if (nextChar == 0) 117 return; --> 118 initOut(); 119 out.write(cb, 0, nextChar); 120 nextChar = 0; 121 } 122 123 private void initOut() throws IOException { 124 if (out == null) { -->125 out = response.getWriter(); 126 } 127 } We have several other filters in place and the error goes away by removing just the CompressionFilter, so the issue is definitely in that one filter. Since this is a pretty common filter, I'm hoping someone else has run into this and has found a fix. Anyone? -Kari Begin forwarded message: From: Jacob Champlin <jac...@rentec.com<mailto:jac...@rentec.com>> Date: September 27, 2011 1:55:39 PM CDT To: <users@tomcat.apache.org<mailto:users@tomcat.apache.org>> Subject: Re: 7.0.21 Redirects failing randomly Reply-To: Tomcat Users List <users@tomcat.apache.org<mailto:users@tomcat.apache.org>> Konstantin, Ok, so I see now why you added the flushBuffer() from spec: http://java.sun.com/javaee/6/docs/api/javax/servlet/http/HttpServletResponse.html#sendRedirect%28java.lang.String%29 "Sends a temporary redirect response to the client using the specified redirect location URL and clears the buffer." Its just we have been running Tomcat, for 5 years and we have lots of code that relied on the fact that sendRedirect did not flush the buffer. I will drop it, but going to be a while before we can go to 7.0.21. Jacob On 09/27/2011 02:32 PM, Jacob Champlin wrote: Konstantin, I believe the new flushBuffer() call you added to Response.java sendRedirect() line #1340. Is breaking all ServletFilters but sending buy flushing the response before filters have a chance to modify the response. Jacob _________________________________ Kari Scott Senior Programmer kari.sc...@cdw.com<mailto:kari.sc...@cdw.com> CDW 5520 Research Park Drive Madison, WI 53711 Office: 608 298 1223 Fax: 608 288 3007