2009-05-08 2 views
2

Windows XPでApache 2.2とTomcat 6.0.18を使用しています。 Apache WebサーバーからTomcatへのトラフィックをリダイレクトするmod_proxyモジュールを有効にしました。私は、このようなリダイレクトを持つようにhttpd.confファイルを更新:ApacheをTomcatにリダイレクトする - アプリケーション内をナビゲートするときにIllegalStateExceptionが発生する

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から任意のリダイレクトを行わない場合は、ナビゲーションが正常に動作します。

どのようなアイデアを検討する必要がありますか?

TIA、 マグナスラッシー

+0

お役に立てば幸いです - それは、HTTPリクエストをプロキシされますTomcatに。 StartIntro.javaとResponseFacade.javaの関連コードを投稿してください。 –

+0

このコードは非常にきれいではありませんが、私はちょうど今の仕事をするコンフィギュレーションを取得する使命を帯びてきました。 StartIntro.java 保護された無効なdoPost(HttpServletRequest要求、HttpServletResponse応答)がServletException、IOExceptionをスローします{ String url = ""; 文字列パラメータ= request.getParameter( "myParameter"); (paramater.equals( "1")) { url = "./ Sales/Introduction.jsp"; } response.sendRedirect(URL)。 } –

+0

リダイレクトされたページ、Introduction.jsp <%@ページ言語= "javaの" contentTypeの= "text/htmlの;のcharset = 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

でより多くを参照してください、私は私の考えを投稿する:

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

優れた情報と "> <フォーム名=" MainFormを」メソッド= "ポスト" アクション= "salesIntroduction" \t ID = "MainFormを"> もの。私は彼の問題が最も可能性が高いとあなたの分析に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のを確認してください)をリッスンするように設定されていることを確認します。デフォルトTomcatで

ポートでAJP接続用6.0.18リッスン8009

その後、あなたは次にあなたがhttp://apachehost/yoururlに行くと、すべてのことができ、あなたの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 

をこのような何かを追加する必要がありますリダイレクトは透過的にする必要があります。 はさらに、HTMLプロキシためAJPは、より低レベルのプロトコルであることがより効率的です。

0

リストまたはJSON経由かもしれないあなたは、あなたのレスポンスをコミットしているし、その後、おそらくあなたは、JSPへのデータの書き込みをしています。 あなたが同じJSPにリダイレクトされ、あなたが「成功」などの文字列を返却する場合、この例外occurs.BecauseはSTRUTS @を通じてSUCCESSを返すが、あなたのレスポンスをコミットし、それはあなたのJSPにそれ以上のデータを投稿することができません。

ソリューション:すべてを行う必要がRETURN NULLで、同じJSPページにリダイレクト.. それはApacheがTomcatにリダイレクトされていないため、質問は少し混乱しています

関連する問題