Tomcat: обрабатывать исключение сервлета
Я настраиваю 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 первые строки stacktrace int на странице ошибок по умолчанию перед завершением)
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 ИНФО: SessionListener: contextInitialized() 09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log ИНФО: 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 вызывает SEVERE: Servlet.service() для php-сервлета Исключение jp.thv бросило исключение: at 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.jva2: atvalv at2.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) в org.apache.catalina.alveErRevalveErv..java:102) в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) в org.apache.coote.http11.Http11Processor.process(Http11Processor.java:845) в org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) в org.apache.tomcat.util.net.JE JIoEndpoint.java:447) на java.lang.Thread.run(неизвестный источник)
1 ответ
Вы обычно объявляете это как <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
ошибка в логах сервера приложений.