5

Tomcat 5.5 と Spring 3.2 を使用しています。web.xml デプロイメント記述子には、次の構成があります -

  <error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
  </error-page>
  <error-page>
    <error-code>403</error-code>
    <location>/403.jsp</location>
  </error-page>
  <error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
  </error-page>

原因不明の動作は、以下のような方法で発生します -

public ModelAndView fileDownload(HttpServletRequest request, 
                                 HttpServletResponse response) throws Exception 
 {
    String filename = (String) request.getParameter("filename");  
    //...more code
    File file = new File(...+ filename); // pseudo code
    OutputStream out = response.getOutputStream();  
    InputStream stream = new FileInputStream(file); // FileNotFoundException here
    //...more code
 }

FileNotFoundException が発生すると、エラー ページのレンダリングに使用されたカスタム 500.jsp は表示されませんが、その代わりに、例外のスタック トレース全体がページ上に表示されます。以下のように 2 つのステートメントの順序を単純に逆にすると、

    InputStream stream = new FileInputStream(file); // FileNotFoundException here
    OutputStream out = response.getOutputStream();

すべてが正しく機能し、ページに正しい 500.jsp がレンダリングされます。

なぜこれが起こるのですか?唯一の違いは、後者の場合、応答オブジェクトの OutputStream が開かれていないことです。

4

3 に答える 3

1

内部的には、JSP が HttpServletResponse で getWriter メソッドを呼び出そうとしている可能性があります。仕様によると、getWriter または getOutputStream を呼び出すことができますが、両方を呼び出すことはできません。すでに getOutputStream を呼び出しているため、JSP は応答に書き込むことができません。

http://docs.oracle.com/javaee/5/api/javax/servlet/ServletResponse.html#getOutputStream()

http://comments.gmane.org/gmane.comp.jakarta.tomcat.user/182025

于 2013-08-03T05:06:12.500 に答える
-1

で定義されたページをレンダリングするには、カスタム コントローラーを追加する必要があると思いますweb.xml

@こちらの説明を参照: Spring を使用した Tomcat のカスタム エラー ページ

于 2013-07-31T20:23:47.950 に答える
-1

あくまで推測ですが、クライアントに送信した後にhttpレスポンス(ヘッダー)を変更できない点に問題があると思います。より正確には、Benjamin Pack の回答を参照してください。

于 2013-07-31T20:49:05.953 に答える