web.xmlのerror-pageがちゃんと表示されない?

月曜日のこと

前々から気になっていたけど、調べるのをサボっていたことを調査してみた。


それは、『web.xmlで指定しているerror-pageが画面に表示されない。』という件。


別のプロジェクトでは出来ていたはずなんだけど、今のプロジェクトでは、ブラウザにerror-pageで指定した画面が表示されない。

とりあえず、現状以下のように設定している。

  〜省略〜
  <error-page>
    <error-code>500</error-code>
      <location>/view/FatalError.jsp</location>
  </error-page>
  〜省略〜

設定自体に間違いはないと思う。


とりあえず、最初にJSPの実行のタイミングによって、表示されたりされなかったりするんじゃないか。
と考え実験してみた。

以下のパターンで実験してみることに。

  1. JSP実行前にエラーが発生する。
  2. JSP実行中にエラーが発生する。(JSPは、errorPage有とerrorPage無の2パターン用意。)
  3. JSP実行後にエラーが発生する。

そんで、実験したみた結果。*1


errorPageを指定したJSP実行中にエラーのときのみ、エラー画面がちゃんと表示された。

他のケースでは表示されない。


なんか納得いかないので、レスポンスの中身を覗いてみる。

すると、errorPageを指定したJSP実行中にエラー以外のケースでもレスポンスボディにちゃんとエラー画面のHTMLが入っている。


何故、表示されないのだろう?


違いといえば、errorPageを指定したJSP実行中にエラーのときは、ステータスコードが200でそれ以外は500だってこと。


分からないので適当にググッてみたら、

http://members.jcom.home.ne.jp/newtype-shira/home/java/tomcaterror.html

ステートが"200"から"400"、"500"番台に変わったことからIEではエラーページが表示されなくなる現象が起きます。これはIEの設定(使用)がそうなっているからです。

と、さらに、

そこでIEの性質上、
256(512)バイト以上のエラーページは"HTTP エラーメッセージを簡易表示する"設定であっても表示される
事を利用し、自分で作成したエラーページを256(512)バイト以上にします

とあった。

早速、error-pageとして使用しているHTMLに半角スペースを500バイト追加してみる。


成功。
どのケースでもエラーページが表示されるようになった。


けど、これってIEだけなんだろうなぁ。。
他のブラウザ入ってないから今試すのはめんどくさい。

あと、携帯端末だとどうなるんだろう。
少なくとも、手元にある携帯エミュレータでは表示できない。*2

もし、携帯端末が、ステータスコード200以外の画面を表示できないということであれば、どうしたらいいだろう?


あと、どのステータスコードを返すかって、APサーバ別に実装が違うみたい。
これも、使うAPサーバによって調査が必要かもしれない。


とりあえず、

  • 対応ブラウザにIEがある場合は、エラーページは512バイト以上にした方がよい。
  • JSPにerrorPage属性はつけた方がいい。

ってことは分かった。

*1:環境は、JDK1.4.2_04、Tomcat5.0.24

*2:J-Skey Viewer http://www.dp.j-phone.com/dp/tool_dl/web/tool.php