2009-12-07 4 views
0

PECL-servlet (PHP/PECL- 버전 5.2.5)을 사용하여 Tomcat 서버에 PHP를 설치하고 있습니다. 서버는 이제 실제 PHP 파일을 성공적으로 처리하지만 존재하지 않는 페이지에 대한 요청에 문제가 있습니다.Tomcat : 서블릿 예외 처리

그런 페이지 f.ex : http://www.mydomain.com/nonexistentfile.php에 대한 요청으로 인해 서블릿은 결코 잡히지 않는 java.io.IOException을 발생시킵니다. 따라서 Tomcat은 종료됩니다.

어떻게 해결할 수 있습니까? 서블릿에서 예외를 잡을 수 있습니까? 기존 파일을 서블릿에만 매핑하는 방법이 있습니까? 답장을


감사는 지금 작동하는 것 같군. web.xml에서 제안한 재 맵핑을 수행하여 php-files를 기본적으로 phpservlet을 감싸고 발생한 예외를 처리하는 최초의 자체 서블릿에 매핑했습니다. 이것은 문제를 해결하는 좋은 방법입니까?

바람둥이가 독자적으로 이러한 예외를 처리 할 수 ​​없다는 것이 조금 이상하게 보입니다. 내가 손상된 상태에서 실행에서 서버를 보호하기 위해 서버를 종료 지점을 볼 수 있지만 사용자 정의 예외 처리를 가능하게해야합니다 ...

여기 내 localhost.2009-12-09.log 호출 후 존재하지 않는 페이지와 직접 phpservlet :

 
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>로 선언 (바람둥이가 종료하기 전에 기본의 errorpage INT 스택 트레이스의 4 첫 선을 표시합니다).

그러나 "당신은 결코 잡히지 않았습니다. 따라서 Tomcat이 종결되었습니다."라고 말하면서 설치에 대한 의문이 생깁니다. 스택 트레이스가있는 Tomcat의 기본 오류 페이지가 실제로 보이지 않습니까? 응용 프로그램 로그에서 아무것도 볼 수 없습니까? IOException에 대해 어떻게 알았습니까?

적어도, 당신은 기본적으로 다음과 같은 줄이 포함 *.phpurl-patternFilter를 매핑 할 수 있습니다 :

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

그러나 문제를 설명하는 방법을보고, 나는 오히려 생각은 PHP 서블릿 또는 응답이 이미 커밋되었으므로 webcontainer가 오류 페이지를 표시하지 못했지만이 경우 앱 서버 로그에 자체적으로 설명하는 IllegalStateException: Response already committed 오류가 발생 했어야합니다.