【问题标题】:Tomcat: Handle Servlet ExceptionTomcat:处理 Servlet 异常
【发布时间】:2010-12-24 04:29:39
【问题描述】:

我正在使用 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 行显示为其默认错误页)

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(未知来源)

【问题讨论】:

    标签: php exception tomcat servletconfig


    【解决方案1】:

    您通常在web.xml 中将其声明为<error-page>

    但是由于您字面意思是“永远不会被捕获。因此终止了Tomcat”,因此我对设置有疑问。你真的没有看到 Tomcat 的默认错误页面,里面有一个堆栈跟踪吗?您在 appserver 日志中没有看到任何内容吗?你是怎么知道IOException的?

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 2011-11-19
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2013-08-13
      相关资源
      最近更新 更多