Tomcat: обработать исключение сервлета - PullRequest
0 голосов
/ 08 декабря 2009

Я устанавливаю PHP на своем Tomcatserver с использованием PECL-сервлета (PHP / PECL-версия 5.2.5). Сервер успешно обрабатывает реальные PHP-файлы, но у меня проблема с запросами на несуществующие страницы.

Запрос на такую ​​страницу, f.ex: http://www.mydomain.com/nonexistentfile.php, заставляет сервлет вызвать исключение java.io.IOException, которое никогда не перехватывается. Поэтому Tomcat прекращается.

Как я могу это исправить? Могу ли я поймать исключения из сервлета? Есть ли способ сопоставить только существующие файлы сервлету?


Спасибо за ответ, похоже, сейчас работает. Я сделал предложенную вами повторную карту в web.xml, сопоставив php-файлы с моим первым самодельным сервлетом, который в основном оборачивает phpservlet и обрабатывает возникшие исключения. Это хороший способ решения проблемы?

Мне немного странно, что tomcat не может самостоятельно обрабатывать такие исключения. Я вижу смысл в завершении работы сервера, чтобы защитить его от выполнения в поврежденных состояниях, но должна быть возможность включить настраиваемую обработку исключений ...

Вот мой localhost.2009-12-09.log после вызова phpservlet напрямую с несуществующей страницы:
(tomcat отображает 4 первые строки стека трассировки в своей странице ошибок по умолчанию перед завершением)

09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: attributeAdded('org.apache.catalina.Registry', 'org.apache.tomcat.util.modeler.Registry@1010058')
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: attributeAdded('org.apache.catalina.MBeanServer', 'com.sun.jmx.mbeanserver.JmxMBeanServer@bdab91')
09.des.2009 13:35:54 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet php threw exception
java.io.IOException: 
 at net.php.servlet.send(Native Method)
 at net.php.servlet.service(servlet.java:190)
 at net.php.servlet.service(servlet.java:214)
 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(Unknown Source)

1 Ответ

0 голосов
/ 08 декабря 2009

Вы обычно объявляете это как <error-page> в web.xml.

Но так как вы буквально сказали: «который никогда не перехватывается. Поэтому Tomcat прекращается», я сомневаюсь в настройке. Вы действительно не видите страницу ошибок Tomcat по умолчанию с трассировкой стека внутри? Вы ничего не видите в логах сервера приложений? Как вы узнали о 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 или веб-контейнеру не удалось отобразить страницу с ошибкой, потому что ответ уже зафиксирован, но в этом случае вы должны были увидеть довольно понятное объяснение IllegalStateException: Response already committed ошибка в логах сервера приложений.

...