Bug 53545

Summary: jsp:forward action to static resources causes IllegalStateException when inside classic custom tag
Product: Tomcat 7 Reporter: Radu Gancea <radu.gancea>
Component: Servlet & JSP APIAssignee: Tomcat Developers Mailing List <dev>
Severity: major CC: radu.gancea
Priority: P2    
Version: 7.0.28   
Target Milestone: ---   
Hardware: PC   
OS: All   

Description Radu Gancea 2012-07-13 07:53:20 UTC
If we have a JSP like the one below we get java.lang.IllegalStateException: getOutputStream() has already been called for this response:

1. the jsp:forward is inside classic custom tag ( extends BodyTagSupport).
2. if I put a dynamic resource everything is fine (ex. redirect.jsp)
3. I think that the response gets flushed if jsp:forward redirects to a static resource and that's why the exception is trown.


<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="t" uri="test" %> 

<jsp:forward page="redirect.html"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>

Comment 1 Mark Thomas 2012-08-01 10:15:41 UTC
You should not be writing content after a forward. That it works in any circumstances is pure luck.
Comment 2 Radu Gancea 2012-08-01 10:38:59 UTC
I know that. But jsp:forward action throws IllegalState only when the page is unbuffered. If it's buffered, the buffer clears, the forwarding executes and the rest of the page doesn't execute.

In the generated java files for classic tags there is a finally block that calls a method that invokes getOutputStream and I think it shouldn't. If I use SimpleTag the forward works as it should.

Quote from specs:
"And as with jsp:forward actions from one JSP page to another, the following statement would clear the page buffer, terminate the execution of the JSP page, and execute the servlet: 
<jsp:forward page="/servlet/MyServlet" />"

I am not writing anything inside doStartTag(), etc. 

Please reconsider. I won't open the issue again and sorry if I am too insistent.
Thank you.
Comment 3 Mark Thomas 2012-08-10 22:43:57 UTC
OK. I see what is going on here now. A bug (now fixed) in the custom error page handling wasn't helping.

Tomcat isn't clearing the buffer of the containing page when the forward happens. When Tomcat tries to write that content (after the forward) the ISE happens.

I think I have a fix but I need to do some more testing of the behavior with nested tags before I commit the fix.
Comment 4 Mark Thomas 2012-08-11 09:53:41 UTC
This has been fixed in trunk and 7.0.x and will be included in 7.0.30 onwards. I also added a test case to the unit tests for this issue.