我使用PECL-servlet(PHP / PECL-version 5.2.5)在我的Tomcatserver上设置PHP。服务器现在成功处理真正的PHP文件,但我对不存在页面的请求有问题。
对这样一个页面的请求f.ex:http://www.mydomain.com/nonexistentfile.php会导致servlet引发一个java.io.IOException,它永远不会被捕获。因此Tomcat被终止了。
我该如何解决这个问题?我可以从servlet中捕获异常吗?有没有办法只将现有文件映射到servlet?
感谢您的回复,它似乎现在正在运作。我在web.xml中做了你建议的重新映射,将php文件映射到我的第一个自制的servlet,它基本上包裹了phpservlet并处理引发的异常。这是解决问题的好方法吗?
对我来说,tomcat无法单独处理此类异常似乎有点奇怪。我可以看到终止服务器以防止它在损坏状态下执行的重点,但应该可以启用自定义异常处理......
在使用不存在的页面直接调用phpservlet之后,这是我的localhost.2009-12-09.log:
(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)
答案 0 :(得分: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 servlet或webcontainer无法显示错误页面,因为响应已经提交,但在这种情况下你应该看到一个相当自我解释{{ 1}} appserver日志中的错误。