You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Anthony Brew <at...@gmail.com> on 2010/07/26 06:26:39 UTC

Re: CGIServlet followed by a Filter that modifies the response

> I had hoped to use a CGIServlet to do some stuff for me and then modify the
> response on the fly on the way back with a
>
> like this:
>
> <filter>
>         <filter-name>mod</filter-name>
>         <filter-class>com.util.web.PageFilter</filter-class>
>     </filter>
>
>     <filter-mapping>
>         <filter-name>mod</filter-name>
>         <servlet-name>cgi</servlet-name>
>     </filter-mapping>
>     <servlet>
>          <servlet-name>cgi</servlet-name>
>
> <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
>          <init-param>
>              <param-name>debug</param-name>
>              <param-value>0</param-value>
>          </init-param>
>          <init-param>
>              <param-name>cgiPathPrefix</param-name>
>              <param-value>WEB-INF/cgi</param-value>
>          </init-param>
>          <load-on-startup>5</load-on-startup>
>      </servlet>
>
>     <servlet-mapping>
>            <servlet-name>cgi</servlet-name>
>            <url-pattern>/cgi-bin/*</url-pattern>
>        </servlet-mapping>
>
>
> Unfortunately I am coming across the following:
>
> java.lang.IllegalStateException: getWriter() has already been called for this response
> 	org.apache.catalina.connector.Response.getOutputStream(Response.java:579)
> 	org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:183)
> 	javax.servlet.ServletResponseWrapper.getOutputStream(ServletResponseWrapper.java:102)
> 	org.apache.catalina.servlets.CGIServlet$CGIRunner.run(CGIServlet.java:1754)
> 	org.apache.catalina.servlets.CGIServlet.doGet(CGIServlet.java:587)
> 	javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
> 	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
> 	com.util.web.PageFilter.doFilter(PriceHideFilter.java:31)
>
>
> the page filter method look like
>
> public void doFilter(ServletRequest request, ServletResponse response,
> FilterChain chain) throws ServletException, IOException {
>         System.out.println("Entering the price hide filter");
>         PrintWriter out = response.getWriter();
>         CharResponseWrapper wrapper = new CharResponseWrapper(
>                 (HttpServletResponse)response);
>
>         chain.doFilter(request, wrapper);
>         if(wrapper.getContentType().equals("text/html")) {
>             CharArrayWriter caw = new CharArrayWriter();
>
>             caw.write(
>                     filterText(wrapper.toString()));
>             response.setContentLength(caw.toString().length());
>             out.write(caw.toString());
>         } else
>             out.write(wrapper.toString());
>         out.close();
>     }
>
> where CharResponseWrapper is just a grab of
> http://java.sun.com/j2ee/tutorial/1_3-fcs/examples/src/web/bookstore1/filters/CharResponseWrapper.java
>
> Any help would be very greatly appreciated, I am losing my hair.
>
> *Oh yes and my tomcat specs are *
> *Server version: Apache Tomcat/6.0.16*
> *Server built:   Jan 28 2008 11:35:29*
> *Server number:  6.0.16.0*
> *OS Name:        Linux*
> *OS Version:     2.6.24-27-generic*
> *Architecture:   amd64*
> *JVM Version:    1.6.0_20-b02*
> *JVM Vendor:     Sun Microsystems Inc.*
>
>
> All the Best,
> Brew
>
>
> Phone: 087 - 9179799
> Quidquid latine dictum sit, altum sonatur
>

RE: CGIServlet followed by a Filter that modifies the response

Posted by "Caldarale, Charles R" <Ch...@unisys.com>.
> From: Anthony Brew [mailto:atbrew@gmail.com]
> Subject: Re: CGIServlet followed by a Filter that modifies the response
> 
> > Unfortunately I am coming across the following:
> >
> > java.lang.IllegalStateException: getWriter() has already 
> > been called for this response

Since the CGI servlet uses Response.getOutputStream(), your filter will have to do the same to avoid the exception.  A given response can only use one or the other during its lifetime, as documented in the servlet spec.

 - Chuck


THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY MATERIAL and is thus for use only by the intended recipient. If you received this in error, please contact the sender and delete the e-mail and its attachments from all computers.