Перенаправить Apache в Tomcat - IllegalStateException при навигации в приложении - PullRequest
2 голосов
/ 08 мая 2009

Я использую Apache 2.2 и Tomcat 6.0.18 в Windows XP. Я включил модуль mod_proxy для перенаправления трафика с моего веб-сервера Apache на Tomcat. Я только обновил файл httpd.conf, чтобы перенаправление было таким:

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

Проблема, с которой я сталкиваюсь, заключается в том, что первоначальное перенаправление работает нормально, страница JSP отображается правильно. Когда я пытаюсь перейти на другую страницу JSP, щелкнув меню на странице, я получаю исключение:

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)

Если я не делаю перенаправление из Apache, навигация работает нормально.

Есть идеи, на что мне обратить внимание?

ТИА, Магнус Ласси

Ответы [ 4 ]

13 голосов
/ 19 ноября 2009

Хотя это старая тема, которую ткнуло сообщество , я выложу свои мысли:

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

Это может произойти, если что-то в StartIntro#doPost() уже передало ответ. Ответ фиксируется, когда выполняется одно из следующих случаев:

  1. Ранее был установлен заголовок ответа.
  2. A forward() или include() был вызван для того же ответа ранее.
  3. В ответ записано более 2 КБ данных.
  4. Написано меньше 2 КБ, и вызывается flush().

Я бы дважды проверил, что делает StartIntro#doPost(). Упомянутые 2 КБ зависят от сервера приложений, хотя в случае Tomcat его можно настроить в качестве размера буфера HTTP-соединителя.

Я бы добавил, что распространенная ошибка среди начинающих заключается в том, что они думают, что вызов forward() или sendRedirect() магическим образом завершится и "выпрыгнет" из блока метода, тем самым игнорируя остаток кода. Например:

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

Таким образом, на самом деле это не так. Чтобы это исправить, вам нужно добавить оператор return; в конец блока if или ввести блок else для вызова redirect().

Надеюсь, что эта информация поможет выявить основную причину.

0 голосов
/ 08 мая 2013

Вы отправили свой ответ, и, возможно, вы пишете данные в JSP, возможно, через List или JSON. Если вы перенаправляете на тот же JSP и возвращаете STRING как «успех», возникает это исключение. Потому что возвращение SUCCESS через STRUTS @ фиксирует ваш ответ и не позволяет публиковать дополнительные данные в вашем JSP.

Решение: все, что вам нужно сделать, это вернуть NULL и перенаправить на ту же страницу JSP. Надеюсь, это поможет вам

0 голосов
/ 12 июля 2011

Используйте AJP Proxy, который поддерживается Apache 2.2 и Tomcat 6.0.18.

Вам нужно установить mod_proxy_ajp для apache, если он еще не установлен, и убедиться, что tomcat настроен на прослушивание соединений ajp (проверьте server.xml).

По умолчанию Tomcat 6.0.18 прослушивает соединения AJP в порту 8009.

Затем вам нужно добавить что-то подобное в ваш httpd.conf

 <Proxy *>
     AddDefaultCharset Off
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass /yoururl ajp://ip.for.tomcat.server:8009/yoururl
   ProxyPassReverse /yoururl ajp://ip.for.tomcat.server:8009/yoururl

Тогда вы можете перейти к http://apachehost/yoururl и все перенаправления должны быть прозрачными. Более того, html-прокси более эффективен, поскольку ajp является протоколом более низкого уровня.

0 голосов
/ 25 мая 2009

Вы можете использовать директиву ProxySet:

ProxySet ajp://mymachine:7001 <parameters>

См. Больше в Документация Apache

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...