2012-01-10 54 views
0

我使用Struts 1.3.10運行一個網站。一切運作良好,但我想爲HTTP 404和其他此類錯誤添加一些自定義錯誤處理。到處都是我看到的自定義錯誤頁面應該是在Web.xml文件中定義的jsp(例如404.jsp)。使用Servlet來定製HTTP錯誤? (Tomcat)的

在我的應用程序,我已經創建,它使用一個錯誤處理servlet來顯示其他的servlet誤差的動態錯誤頁面一個全局錯誤處理程序(例如運行時,總線邏輯等)。從404.jsp(如Web.xml中定義的)重定向到此servlet會有什麼問題嗎?這個想法是打404.jsp,重定向到servlet做我想要的日誌,然後顯示錯誤頁面。我想記錄的內容擺在首位造成的錯誤,比如IP,請求的URI,生成IP地址的列表塊等

我曾嘗試這一點,並在原則上它的工作原理...麻煩的是,我有時會得到非法的狀態錯誤......我想知道如果方法是錯誤的,或者這只是一個壞主意?我看到很多404都是因爲IP看起來錯誤配置的PHP網站而造成的(見下文)。

下面是一個示例錯誤:

:: HTTP 404 ERROR -- page not found. URL requested = /scripts/setup.php 
2012-01-09 20:23:39,375 | ERROR | (ApplicationDispatcher.java:691) - Servlet.service() for servlet jsp threw exception 
java.lang.IllegalStateException 
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:433) 
    at org.apache.struts.taglib.logic.RedirectTag.doRedirect(RedirectTag.java:314) 
    at org.apache.struts.taglib.logic.RedirectTag.doEndTag(RedirectTag.java:268) 
    at org.apache.jsp._404_jsp._jspx_meth_logic_005fredirect_005f0(_404_jsp.java:118) 
    at org.apache.jsp._404_jsp._jspService(_404_jsp.java:74) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:659) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:364) 
    at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:285) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200) 
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) 
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:775) 
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:704) 
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:897) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:619) 
Jan 9, 2012 8:23:39 PM org.apache.catalina.core.StandardHostValve custom 
SEVERE: Exception Processing ErrorPage[errorCode=404, location=/404.jsp] 
org.apache.jasper.JasperException 
    at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:498) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:405) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:659) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:311) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:364) 
    at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:285) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200) 
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291) 
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:775) 
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:704) 
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:897) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:619) 

回答

3

不應控制JSP內的請求/響應。 JSP基本上是響應的一部分。嘗試更改JSP內的響應可能會在響應已提交時導致非法狀態異常。通常,在JSP中編寫原始Java代碼和/或控制請求/響應是poor practice

只是錯誤頁面的位置直接映射到一個servlet。

<error-page> 
    <error-code>404</error-code> 
    <location>/someErrorServlet</location> 
</error-page> 

其中/someErrorServlet錯誤處理的servlet的<url-pattern>匹配。在那裏,你可以自由地控制請求/響應,例如轉發到任意的JSP。

+0

我喜歡這個,它會擴展到似乎所有的錯誤,讓我在的ErrorHandler專門處理每個錯誤。但是,如果503錯誤是頁面而不是servlet?我在想如果它實際上是一個真正的內部錯誤,那麼這個servlet可能會受到攻擊而不會觸發。 – user991945 2012-01-10 19:55:13

+0

它可以是一個servlet,但例外情況(在5NN錯誤)的記錄應該由'Filter'來完成。基本上只需將'chain.doFilter(request,response)'放在'try-catch'內。 – BalusC 2012-01-10 20:01:21