2012-01-10 10 views
0

私はStruts 1.3.10を使ってサイトを運営しています。すべてうまくいきますが、HTTP 404などのカスタムエラー処理を追加したいと思います。私が見ているところでは、カスタムエラーページはWeb.xmlファイルで定義されているjsp(例:404.jsp)である必要があります。カスタムHTTPエラーにはサーブレットを使用しますか? (Tomcat)

私のアプリでは、エラー処理サーブレットを使用して他のサーブレットエラー(ランタイム、バスロジックなど)の動的エラーページを表示するグローバルエラーハンドラを作成しました。 404.jsp(Web.xmlに定義されている)からこのサーブレットにリダイレクトすると何か問題がありますか?アイデアは404.jspを打つことで、サーブレットにリダイレクトされ、必要なロギングを行い、次にエラーページを表示します。 IPアドレス、要求されたURI、ブロックするIPのリストなどを生成します。

私はこれを試して、原則として動作します...問題は、時々違法な州のエラーを取得することです...私はアプローチが間違っているか、これは単なる悪い考えですか?私は、誤って設定されたPHPサイトのためにIPのトローリングから多くの404を取得します(下記参照)。ここで

は、サンプルのエラーです:

:: 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内の応答を変更しようとすると、応答がすでにコミットされているときに不正な状態例外が発生する可能性があります。一般に、生のJavaコードを記述したり、JSPで要求/応答を制御したりするのはpoor practiceです。

エラーページの場所をサーブレットに直接マップするだけです。 /someErrorServletあなたのエラー処理サーブレットの<url-pattern>と一致する

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

。そこには、任意のJSPへの転送など、リクエスト/応答を自由に制御することができます。

+0

私はこれが好きであり、それはエラーが発生したらしくなるようにスケールされ、errorHandlerで特にエラーを処理することができます。しかし、503エラーはサーブレットではなくページでなければなりませんか?私はそれが実際に真の内部エラーであるならば、サーブレットが損なわれ、発火しないかもしれないと思っています。 – user991945

+0

サーブレットでもかまいませんが、例外のログ(5nnエラー)は 'Filter'によって行わなければなりません。基本的に 'try-catch'の中に' chain.doFilter(request、response) 'を入れてください。 – BalusC

関連する問題