0

我正在使用 PECL-servlet(PHP/PECL-version 5.2.5)在我的 Tomcat 服务器上设置 PHP。服务器现在成功地处理了真正的 PHP 文件,但是我遇到了请求不存在页面的问题。

对此类页面 f.ex: http://www.mydomain.com/nonexistentfile.php的请求会导致 servlet 引发 java.io.IOException,该异常从未被捕获。因此,Tomcat 被终止。

我怎样才能解决这个问题?我可以从 servlet 中捕获异常吗?有没有办法只将现有文件映射到 servlet?


感谢您的回复,它现在似乎正在工作。我在 web.xml 中做了你建议的重新映射,将 php 文件映射到我的第一个自制 servlet,它基本上包裹了 phpservlet 并处理引发的异常。这是解决问题的好方法吗?

对我来说,tomcat 无法自行处理此类异常似乎有点奇怪。我可以看到终止服务器以防止其在损坏状态下执行的意义,但应该可以启用自定义异常处理......

这是我的 localhost.2009-12-09.log 在直接使用不存在的页面调用 phpservlet 后:
(tomcat 在终止之前显示堆栈跟踪的前 4 行 int 它的默认错误页面)

09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext 日志
信息:上下文侦听器:上下文初始化()
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext 日志
信息:SessionListener:contextInitialized()
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext 日志
信息:ContextListener:attributeAdded('org.apache.catalina.Registry','org.apache.tomcat.util.modeler.Registry@1010058')
09.des.2009 13:35:50 org.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 调用
严重:servlet 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>in web.xml

但是,既然你字面上说,“它永远不会被抓住。Tomcat因此被终止”,我对设置有疑问。你真的没有看到 Tomcat 的默认错误页面,里面有一个堆栈跟踪吗?您在应用服务器日志中没有看到任何内容吗?你是怎么知道的IOException

至少,您可以尝试在其上映射 a Filterurl-pattern其中*.php基本上包含以下几行:

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

IllegalStateException: Response already committed但是看到你如何描述问题,我宁愿认为 PHP servlet 或 webcontainer 未能显示错误页面,因为响应已经提交,但在这种情况下,你应该在 appserver 日志中看到一个相当不言自明的错误.

于 2009-12-07T23:12:41.900 回答