You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by "Craig R. McClanahan" <cr...@apache.org> on 2001/08/22 18:36:26 UTC

Re: TC 4.0 - IllegalStateException: Cannot create a session after the response has been committed

See below.

On Wed, 22 Aug 2001, Blanchard Andrew H (CPOCEUR) wrote:

> I'm trying to get OpenSymphony Sitemesh 1.2 running under Tomcat 4.0.  I've
> tried beta 7 and dev beta 8.  Anyway, I'm receiving the following exception:
>
> java.lang.IllegalStateException: Cannot create a session after the response
> has been committed
> 	at
> org.apache.catalina.connector.HttpRequestBase.doGetSession(HttpRequestBase.j
> ava:1104)
> 	at
> org.apache.catalina.connector.HttpRequestBase.getSession(HttpRequestBase.jav
> a:1064)
> 	at
> org.apache.catalina.connector.HttpRequestFacade.getSession(HttpRequestFacade
> .java:209)
> 	at
> org.apache.catalina.connector.HttpRequestFacade.getSession(HttpRequestFacade
> .java:218)
> 	at
> javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWr
> apper.java:268)
> 	at
> org.apache.jasper.runtime.PageContextImpl._initialize(PageContextImpl.java:1
> 38)
> 	at
> org.apache.jasper.runtime.PageContextImpl.initialize(PageContextImpl.java:11
> 4)
> 	at
> org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext(JspFactoryIm
> pl.java:175)
> 	at
> org.apache.jasper.runtime.JspFactoryImpl.getPageContext(JspFactoryImpl.java:
> 154)
> 	at
> org.apache.jsp._0002fdecorators_0002fmain_jsp._jspService(_0002fdecorators_0
> 002fmain_jsp.java:45)
> 	at
> org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> 	at
> org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.ja
> va:201)
> 	at
> org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:381)
> 	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:458)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
> 	at
> org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.
> java:672)
> 	at
> org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatch
> er.java:563)
> 	at
> org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher
> .java:486)
> 	at
> com.sitemesh.filter.PageFilter.applyDecorator(PageFilter.java:192)
> 	at com.sitemesh.filter.PageFilter.doFilter(PageFilter.java:114)
> 	at
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
> FilterChain.java:213)
> 	at
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
> ain.java:193)
> 	at
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.ja
> va:243)
> 	at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 66)
> 	at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> 	at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> 	at
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
> va:215)
> 	at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 66)
> 	at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> 	at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> 	at
> org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2314)
> 	at
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164
> )
> 	at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 66)
> 	at
> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:462)
> 	at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 64)
> 	at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> 	at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> 	at
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
> :163)
> 	at
> org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:5
> 66)
> 	at
> org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
> 	at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
> 	at
> org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:
> 1000)
> 	at
> org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1093
> )
> 	at java.lang.Thread.run(Thread.java:484)
>
> Opening up the Tomcat /work directory, I'm able to look at the servlet code
> generated by Tomcat from the JSP.  (_0002fdecorators_0002fmain_jsp.java:45)
>
> <snip>
> (43)   _jspxFactory = JspFactory.getDefaultFactory();
> (44)   response.setContentType("text/html;charset=ISO-8859-1");
> (45)   pageContext = _jspxFactory.getPageContext(this, request, response,"",
> true, 8192, true);
> </snip>
>
> I understand that once the response has been committed, you can't forward or
> redirect it.  But what's going on here?  Why is
> _jspxFactory.getPageContext(...) throwing this exception?  This code is
> essentially right at the beginning of the servlet, before it even gets to
> JSP content.  How do I tell Tomcat not to generate the setContentType(...)
> method until after the getPageContext(...) call?  Or is the problem
> something completely different?
>

By default, JSP pages try to create a session unless you tell them not to
in the <%@ page %> directive.  Thus, if you call a new page after the
response has been committed, this is exactly what is supposed to happen.

>From the stack trace, it looks like Sitemesh is using both filters and
request dispatchers, any of which could cause the response to be
committed.

> Thank you,
> Andy Blanchard
>
>

Craig