Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redirect Apache to Tomcat - IllegalStateException when navigating in the app

I'm using Apache 2.2 and Tomcat 6.0.18 on Windows XP. I've enabled the mod_proxy module to redirect the traffic from my Apache web server to Tomcat. I only updated the httpd.conf file to have the redirection like this:

ProxyPass         /myapp  http://MYMACHINENAME:8080/MyApp/Start
ProxyPassReverse  /myapp  http://MYMACHINENAME:8080/MyApp/Start

The problem I'm experiencing is that the initial redirect works fine, the JSP page renders correctly. When I try to navigate to a different JSP page by clicking on a menu on the page, I get the exception:

SEVERE: Servlet.service() for servlet StartIntro threw exception
java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
    at StartIntro.doPost(StartIntro.java:103)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    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:191)
    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:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:595)

If I don't do any redirection from Apache, the navigation works fine.

Any ideas what I should look into?

TIA, Magnus Lassi

like image 430
Magnus Lassi Avatar asked Jan 30 '26 01:01

Magnus Lassi


1 Answers

Although this is an old topic which was been poked by community, I'll post my thoughts:

java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
    at StartIntro.doPost(StartIntro.java:103)

This can happen if something in StartIntro#doPost() has already committed the response. A response is commited when one of the following cases is met:

  1. A response header has been set before.
  2. A forward() or include() has been invoked on the same response before.
  3. More than 2KB of data is been written to response.
  4. Less than 2KB is been written and flush() is invoked.

I would doublecheck what the StartIntro#doPost() is all doing. The mentioned 2KB is appserver-dependent though, in case of Tomcat it's configureable as buffer size of the HTTP connector.

I would add, a common mistake among starters is that they think that the call of a forward() or a sendRedirect() would magically exit and "jump" out of the method block, hereby ignoring the remnant of the code. For example:

protected void doPost() {
    if (someCondition) {
        forward();
    }
    redirect(); // This is STILL invoked when someCondition is true!
}

This is thus actually not true. To fix this you would need to add a return; statement to the end of the if block, or to introduce an else block for the redirect() call.

Hope this information helps in nailing down the root cause.

like image 139
BalusC Avatar answered Jan 31 '26 15:01

BalusC