You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Thomas Okken <to...@ncstech.com> on 2008/01/09 18:14:43 UTC

response.sendRedirect() failing mysteriously in struts application

Hi all,

I'm running into a problem in a struts application I'm working on.
In my struts-config.xml, I have this action-mapping:

       <action path="/register"
           scope="session"
           name="RegistrationForm"
           type="com.foo.RegistrationAction">
           <forward name="success" path="/index.jsp" redirect="true"/>
           <forward name="failure" path="/register.jsp" redirect="true"/>
       </action>

The RegistrationAction.execute() method takes several request parameters 
and uses them to create an account; when this is successful, it returns 
mapping.findForward("success"), and otherwise, it returns 
mapping.findForward("failure").
For reasons I have not been able to determine, the redirection often 
fails. RegistrationAction.execute() will run successfully, the 
mapping.findForward() succeeds and finds the correct forward, which is 
then returned -- but an exception is thrown while the redirect is sent 
to the client. This is the full log output:

Jan 9, 2008 11:11:35 AM org.apache.catalina.core.StandardWrapperValve 
invoke
SEVERE: Servlet.service() for servlet action threw exception
java.lang.IllegalStateException
   at 
org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) 

   at 
org.apache.struts.chain.commands.servlet.PerformForward.handleAsRedirect(PerformForward.java:125) 

   at 
org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:94) 

   at 
org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54) 

   at 
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) 

   at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
   at 
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304) 

   at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
   at 
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) 

   at 
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
   at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
   at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 

   at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

   at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 

   at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 

   at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 

   at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 

   at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 

   at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
   at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
   at 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584) 

   at 
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
   at java.lang.Thread.run(Thread.java:595)
Jan 9, 2008 11:11:35 AM org.apache.catalina.core.StandardHostValve custom
SEVERE: Exception Processing 
ErrorPage[exceptionType=java.lang.Exception, location=/error.jsp]
java.lang.IllegalStateException
   at org.apache.coyote.Response.reset(Response.java:297)
   at org.apache.catalina.connector.Response.reset(Response.java:652)
   at org.apache.catalina.connector.Response.reset(Response.java:916)
   at 
org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:417) 

   at 
org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:271) 

   at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 

   at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 

   at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 

   at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
   at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
   at 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584) 

   at 
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
   at java.lang.Thread.run(Thread.java:595)

I understand that the second exception happens because, after sending a 
redirect, it is no longer possible to forward to the error page, but 
what is a complete mystery to me is why the first exception occurs.
RegistrationAction.execute() never touches the response, so struts 
should have no problem sending the redirect to /index.jsp (or back to 
/register.jsp, in the case of failure).
This exception does not happen consistently. Sometimes it does, 
sometimes it doesn't, with no pattern that I have been able to find. 
Even when I post the exact same request over and over.
I'm using Struts 1.3 and Tomcat 6.0.14.

- Thomas

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: response.sendRedirect() failing mysteriously in struts application

Posted by David Delbecq <de...@oma.be>.
The illegalStateException while sendRedirect happens because some 
content has already been submitted to client, thus the http code (OK) 
was already send and it's too late to change headers. Check your action 
don't do make output in the action.

Thomas Okken wrote:
> Hi all,
>
> I'm running into a problem in a struts application I'm working on.
> In my struts-config.xml, I have this action-mapping:
>
>       <action path="/register"
>           scope="session"
>           name="RegistrationForm"
>           type="com.foo.RegistrationAction">
>           <forward name="success" path="/index.jsp" redirect="true"/>
>           <forward name="failure" path="/register.jsp" redirect="true"/>
>       </action>
>
> The RegistrationAction.execute() method takes several request 
> parameters and uses them to create an account; when this is 
> successful, it returns mapping.findForward("success"), and otherwise, 
> it returns mapping.findForward("failure").
> For reasons I have not been able to determine, the redirection often 
> fails. RegistrationAction.execute() will run successfully, the 
> mapping.findForward() succeeds and finds the correct forward, which is 
> then returned -- but an exception is thrown while the redirect is sent 
> to the client. This is the full log output:
>
> Jan 9, 2008 11:11:35 AM org.apache.catalina.core.StandardWrapperValve 
> invoke
> SEVERE: Servlet.service() for servlet action threw exception
> java.lang.IllegalStateException
>   at 
> org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) 
>
>   at 
> org.apache.struts.chain.commands.servlet.PerformForward.handleAsRedirect(PerformForward.java:125) 
>
>   at 
> org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:94) 
>
>   at 
> org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54) 
>
>   at 
> org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) 
>
>   at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
>   at 
> org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304) 
>
>   at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
>   at 
> org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) 
>
>   at 
> org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
>   at 
> org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
>   at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
>   at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
>   at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
>
>   at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
>
>   at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
>
>   at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
>
>   at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
>
>   at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
>
>   at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
>
>   at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263) 
>
>   at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
>
>   at 
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584) 
>
>   at 
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>   at java.lang.Thread.run(Thread.java:595)
> Jan 9, 2008 11:11:35 AM org.apache.catalina.core.StandardHostValve custom
> SEVERE: Exception Processing 
> ErrorPage[exceptionType=java.lang.Exception, location=/error.jsp]
> java.lang.IllegalStateException
>   at org.apache.coyote.Response.reset(Response.java:297)
>   at org.apache.catalina.connector.Response.reset(Response.java:652)
>   at org.apache.catalina.connector.Response.reset(Response.java:916)
>   at 
> org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:417) 
>
>   at 
> org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:271) 
>
>   at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
>
>   at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
>
>   at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
>
>   at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263) 
>
>   at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
>
>   at 
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584) 
>
>   at 
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>   at java.lang.Thread.run(Thread.java:595)
>
> I understand that the second exception happens because, after sending 
> a redirect, it is no longer possible to forward to the error page, but 
> what is a complete mystery to me is why the first exception occurs.
> RegistrationAction.execute() never touches the response, so struts 
> should have no problem sending the redirect to /index.jsp (or back to 
> /register.jsp, in the case of failure).
> This exception does not happen consistently. Sometimes it does, 
> sometimes it doesn't, with no pattern that I have been able to find. 
> Even when I post the exact same request over and over.
> I'm using Struts 1.3 and Tomcat 6.0.14.
>
> - Thomas
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org