0

PECLサーブレット(PHP / PECLバージョン5.2.5)を使用してTomcatserverでPHPをセットアップしています。サーバーは実際のPHPファイルを正常に処理するようになりましたが、存在しないページのリクエストに問題があります。

このようなページ(f.ex:http ://www.mydomain.com/nonexistentfile.php)を要求すると、サーブレットはjava.io.IOExceptionを発生させますが、これはキャッチされません。したがって、Tomcatは終了します。

どうすればこれを修正できますか?サーブレットからの例外をキャッチできますか?既存のファイルのみをサーブレットにマップする方法はありますか?


返信ありがとうございます、それは今働いているようです。提案された再マッピングをweb.xmlで行い、phpファイルを最初の自作サーブレットにマッピングしました。これは基本的にphpservletをラップし、発生した例外を処理します。これは問題を解決する良い方法ですか?

tomcatがそのような例外を単独で処理できないことは私には少し奇妙に思えます。破損した状態での実行からサーバーを保護するためにサーバーを終了することのポイントはわかりますが、カスタムの例外処理を有効にすることは可能であるはずです...

存在しないページでphpservletを直接呼び出した後の私のlocalhost.2009-12-09.logは次のとおりです
(tomcatは、終了する前に、スタックトレースの最初の4行をデフォルトのエラーページに表示します)

09.des.200913:35:50org.apache.catalina.core.ApplicationContextログ
情報:ContextListener:contextInitialized()
09.des.200913:35:50org.apache.catalina.core.ApplicationContextログ
情報:SessionListener:contextInitialized()
09.des.200913:35:50org.apache.catalina.core.ApplicationContextログ
情報:ContextListener:attributeAdded('org.apache.catalina.Registry'、'org.apache.tomcat.util.modeler.Registry@1010058')
09.des.200913:35:50org.apache.catalina.core.ApplicationContextログ
情報:ContextListener:attributeAdded('org.apache.catalina.MBeanServer'、'com.sun.jmx.mbeanserver.JmxMBeanServer@bdab91')
09.des.2009 13:35:54 org.apache.catalina.core.StandardWrapperValve invoke
重大:サーブレットphpのServlet.service()が例外をスローしました
java.io.IOException:
 net.php.servlet.send(ネイティブメソッド)で
 net.php.servlet.service(servlet.java:190)で
 net.php.servlet.service(servlet.java:214)で
 javax.servlet.http.HttpServlet.service(HttpServlet.java:717)で
 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)で
 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)で
 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)で
 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)で
 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)で
 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)で
 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)で
 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)で
 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)で
 org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583)で
 org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:447)で
 java.lang.Thread.run(不明なソース)で
4

1 に答える 1

0

通常はのように宣言し<error-page>ますweb.xml

しかし、あなたは文字通り「これは決して捕まえられない。Tomcatは終了する」と言ったので、私はセットアップについて疑問を持っています。スタックトレースが内部にあるTomcatのデフォルトのエラーページが本当に表示されませんか?appserverログに何も表示されませんか?どうやって知ったのIOException

少なくとも、基本的に次の行が含まれFilterているurl-patternにマップを試みることができます。*.php

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException {
    try {
        chain.doFilter(request, response);
    } catch (IOException e) { 
        // Handle it.
    }
}

しかし、問題の説明を見ると、応答がすでにコミットされているため、PHPサーブレットまたはWebコンテナがエラーページを表示できなかったと思いますが、この場合IllegalStateException: Response already committed、appserverログにかなり自明のエラーが表示されているはずです。 。

于 2009-12-07T23:12:41.900 に答える