2009-12-07 49 views
0

我使用PECL-servlet(PHP/PECL-version 5.2.5)在我的Tomcatserver上設置PHP。服務器現在成功地處理真正的PHP文件,但我對請求不存在的頁面有問題。Tomcat:處理Servlet異常

對這樣一個頁面的請求,f.ex:http://www.mydomain.com/nonexistentfile.php,導致servlet引發java.io.IOException,這是一個永遠不會被捕獲的。 Tomcat因此被終止。

我怎樣才能解決這個問題?我可以從servlet中捕獲異常嗎?有沒有辦法只將現有的文件映射到servlet?


感謝您的回覆,它似乎現在工作。我在web.xml中建立了重定位映射,將php-files映射到我的第一個自制servlet,它基本上圍繞着phpservlet並處理引發的異常。這是解決問題的好方法嗎?

對我來說,看起來有點奇怪,tomcat無法自行處理這些異常。我可以看到終止服務器的目的,以保護它免於在損壞狀態下執行,但應該可以啓用自定義異常處理...

以下是我調用後的localhost.2009-12-09.log直接與不存在的網頁phpservlet:
(Tomcat的顯示棧跟蹤INT其默認的errorPage的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', '[email protected]') 
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log 
INFO: ContextListener: attributeAdded('org.apache.catalina.MBeanServer', '[email protected]') 
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

您通常在web.xml聲明爲<error-page>

但是由於你的字面意思是「永遠不會被捕獲的,Tomcat因此被終止」,我對我的設置感到懷疑。你真的沒有看到Tomcat的默認錯誤頁面裏面有一個stacktrace嗎?你沒有看到應用程序服務器日誌中的任何內容嗎?你怎麼知道IOException

至少,你可以嘗試將Filter*.php基本上包含以下行的url-pattern地圖:

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

但看到你如何描述的問題,我寧願認爲PHP的servlet或webcontainer未能顯示錯誤頁面,因爲響應已經提交,但在這種情況下,您應該在應用服務器日誌中看到相當自我解釋的IllegalStateException: Response already committed錯誤。