2009-05-08 5 views
2

Windows XP에서 Apache 2.2 및 Tomcat 6.0.18을 사용하고 있습니다. Apache 웹 서버에서 Tomcat으로 트래픽을 리디렉션하도록 mod_proxy 모듈을 활성화했습니다.아파치를 Tomcat으로 리디렉션 - 응용 프로그램을 탐색 할 때 IllegalStateException이 발생합니다.

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

내가 겪고있어 문제는 초기 리디렉션 잘 작동한다는 것입니다, JSP 페이지가 제대로 렌더링 : I는이 같은 리디렉션을 가지고 httpd.conf 파일을 업데이트했습니다. 나는 페이지의 메뉴를 클릭하여 다른 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) 

는 탐색이 잘 작동합니다.

내가 조사해야 할 아이디어가 있습니까?

TIA, 매그너스 라시

+0

도움이되기를 바랍니다 Tomcat에. StartIntro.java 및 ResponseFacade.java에 대한 관련 코드를 게시하십시오. –

+0

이 코드는별로 좋지 않지만 지금은 제대로 작동하도록 구성되어 있습니다. StartIntro.java 무효화 된 doPost (HttpServletRequest 요청, HttpServletResponse 응답)가 ServletException, IOException을 throw합니다. { String url = ""; String parameter = request.getParameter ("myParameter"); if (isParamValid (paramater)) { if (paramater.equals ("1")) { url = "./ Sales/Introduction.jsp"; } response.sendRedirect (url); } –

+0

리디렉션 페이지 Introduction.jsp <% @ 페이지 언어 = "자바"의 contentType = "text/html과; 문자셋 = ISO-8859-1 ' \t pageEncoding ='ISO-8859-1 '%> <% @ page import = "Shared.BaseServlet"%> <% \t SalesProxy salesProxy = (SalesProxy) session.getAttribute ("salesProxy"); %> 판매 정보 <바디 스타일 = "너비 : 775px; 정적 HTML –

답변

0

당신은 ProxySet 지시문을 사용할 수 있습니다 :이 community로 찌르고 된 된 된 주제이지만

ProxySet ajp://mymachine:7001 <parameters> 

Apache Documentation

13

더보기를, I 내 생각을 게시 할 것입니다 :

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

StartIntro#doPost()에있는 항목이 이미 응답을 커밋 한 경우에 발생할 수 있습니다. 다음 경우 중 하나가 충족되면 응답이 이루어집니다.

  1. 응답 헤더가 설정되었습니다.
  2. forward() 또는 include()이 전에 동일한 응답에서 호출되었습니다.
  3. 응답에 2KB 이상의 데이터가 기록되었습니다.
  4. 2KB 미만이 기록되었으며 flush()이 호출되었습니다.

StartIntro#doPost()이 무엇을하고 있는지 다시 확인합니다. 언급 된 2KB는 어플리케이션 서버에 의존하지만 Tomcat의 경우 HTTP 커넥터의 버퍼 크기로 구성 할 수 있습니다.

내가 덧붙이 겠지만, 시동기의 일반적인 실수는 forward() 또는 sendRedirect()의 호출이 마술처럼 이탈하여 메소드 블록 밖으로 "뛰어"나와 코드의 나머지 부분을 무시한다고 생각한다는 것입니다. 예 :

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

따라서 실제로는 사실이 아닙니다. 이 문제를 해결하려면 if 블록 끝에 return; 문을 추가하거나 redirect() 호출에 else 블록을 추가해야합니다.

이 정보가 근본 원인을 밝히는 데 도움이되기를 바랍니다.

+0

우수한 정보 ">

물건. 나는 그의 문제가 무엇 이었을지에 대한 귀하의 분석에 100 % 동의합니다. "처음 시작하는 사람들이 흔히 저지르는 실수": 실제로 .NET과 같은 다른 프레임 워크에서 작동하는 방식입니다. – Pixel

+0

여러분을 환영합니다. – BalusC

+0

감사합니다. @BalusC; – confucius

0

Apache 2.2 및 Tomcat 6.0.18에서 지원되는 AJP Proxy를 사용하십시오.

Apache가 이미 설치되어 있지 않은 경우 mod_proxy_ajp를 설치해야하며 tomcat이 ajp 연결 (server.xml 확인)을 수신하도록 구성되어 있는지 확인해야합니다. 당신이 당신의 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 

을이 뭔가를 추가 할 필요가 그리고 8009

포트 AJP 연결을위한

기본 톰캣으로

6.0.18 듣는다 당신은 http://apachehost/yoururl 모두에 갈 수 리디렉션은 투명하게 만들어야합니다. 또한 ajp가 더 낮은 수준의 프로토콜이므로 html 프록시가 더 효율적입니다.

0

응답을 커밋 했으므로 JSP로 데이터를 쓰는 것이 List 또는 JSON 일 수 있습니다. 동일한 JSP로 리디렉션하고 STRING을 "success"로 반환하는 경우이 예외가 발생합니다. STRUCTS를 통해 SUCCESS를 반환하면 @가 응답을 커밋하므로 더 이상 데이터를 JSP에 게시 할 수 없습니다.

해결 방법 : -는 HTTP 요청을 프록시입니다 당신이해야 할 모든 RETURN NULL과 같은 JSP 페이지로 리디렉션 .. 그것은 당신에게 아파치 톰캣로 리디렉션되지 않기 때문에 문제는 약간 혼란