最後の砦web.xmlのerror-page要素が破られた
スタックトレースなどアプリケーションが吐き出す詳細な例外情報が出力されてしまうことは、セキュリティ上あまり望ましくありません。この情報を使用して攻撃を仕掛けてくる悪い人達がいるかもしれないからです。
この問題を防ぐための選択肢は2通りあると思われます。
1. 絶対に例外が発生しない完璧なコードを書く
2. 詳細な情報を含まないエラーページを表示する
私は完璧なコードを書ける自信がないので、2.を選択しています。strutsを使用していますので、struts-config.xmlのglobal-exceptions + web.xmlのerror-pageという二段構えの対策です。融通が効くのでエラーページはjspで作成しています。
<global-exceptions> <exception key="error.global" type="java.lang.Exception" path="/WEB-INF/jsp/error.jsp"/> </global-exceptions> <error-page> <error-code>500</error-code> <location>/WEB-INF/jsp/error.jsp</location> </error-page>
しかし先日、この二段構えを突き破ってスタックトレースが表示されてしまうという問題が発生してしまいました。
発生箇所はファイルダウンロードなどresponse.getOutputStream()メソッドを使用するロジックです。Servlet仕様では、response.getOutputStream()コール後のresponse.getWriter()コールが禁止されているのですが、エラーページを表示する為のjspがresponse.getWriter()メソッドを呼び出すために問題が発生したようです。
どうすればよいか??と頭を悩ませましたが、response.getOutputStream()メソッドを呼び出すタイミングを出来るだけ遅くするといった解決策しか思い浮かびませんでした。エラーページをjspで作成しないという選択もあるのかもしれませんが・・・