gpt4 book ai didi

php - Tomcat:处理 Servlet 异常

转载 作者:行者123 更新时间:2023-11-28 23:54:31 30 4
gpt4 key购买 nike

我正在使用 PECL-servlet(PHP/PECL 版本 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 在终止前显示堆栈跟踪 int 其默认错误页面的前 4 行)

09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext logINFO: ContextListener: contextInitialized()09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext logINFO: SessionListener: contextInitialized()09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext logINFO: ContextListener: attributeAdded('org.apache.catalina.Registry', 'org.apache.tomcat.util.modeler.Registry@1010058')09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext logINFO: ContextListener: attributeAdded('org.apache.catalina.MBeanServer', 'com.sun.jmx.mbeanserver.JmxMBeanServer@bdab91')09.des.2009 13:35:54 org.apache.catalina.core.StandardWrapperValve invokeSEVERE: Servlet.service() for servlet php threw exceptionjava.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)

最佳答案

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

但是由于您从字面上说“从未被捕获。因此 Tomcat 已终止”,我对设置表示怀疑。你真的没有看到 Tomcat 的默认错误页面里面有一个 stacktrace 吗?您在应用服务器日志中没有看到任何内容吗?你是怎么知道 IOException 的?

至少,你可以尝试在 Filterurl-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 未能显示错误页面,因为响应已经提交,但在这种情况下你应该看到一个相当 self 解释的 IllegalStateException: Response already committed 错误在应用服务器日志中。

关于php - Tomcat:处理 Servlet 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1862857/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com