前回「文字列処理と入力チェック」までで、入力チェックの仕組みが組み込まれた共有ブックマークが出来上がりました。本連載の最終回となる今回は、予期しない内部エラーが発生したときのエラーページの表示方法と、コネクションプールを用いたデータベースアクセスの効率化について述べ、最後にこの連載のまとめを行います。
JSPプログラムの内部エラーが発生した場合、通常ではエラーの内容を示すメッセージがブラウザに表示されます。開発者にとっては有益な情報ですが、このメッセージが一般ユーザーに見られてしまうと、JSPプログラムの内部構造が分かってしまい、都合が悪いことがあります。
JSPでは、内部エラーが発生したときにどのページを表示するかをページディレクティブで指定できます。この仕組みを使用することで、一般ユーザーにはエラーの詳細を隠しながら、管理者はエラーの詳細を調べられるようになります。当然のことながら、エラーログのチェックも重要ですが、Webページ上で簡単にエラーの内容を確認できる仕組みは便利です。
今回紹介する、内部エラーに対する処理の流れは下図のようになります。
まず、表示ページのディレクティブに次のように記述します。
<%@ page contentType="text/html; charset=euc-jp" errorPage="/error_page.jsp" %>
errorPage="/error_page.jsp" の記述により、エラーが発生したときには、error_page.jspの内容が表示されるようになります。
今回、このerror_page.jspでは、アクセスされたリモートIPアドレスをチェックし、ローカルIPであればエラーの詳細を表示し、そうでなければerror_message.jspへ再度転送し、一般ユーザー向けのエラーメッセージを表示するようにします。
それでは、動作テスト用に次のようなエラーが発生するJSPプログラムを作成してみます。
1: <%@ page contentType="text/html; charset=euc-jp" errorPage="/error_page.jsp" %> 2: <% 3: // エラーの発生する例 4: Object nullObject = null; 5: out.println(nullObject.toString()); 6: %>
上記のプログラムに文法的な誤りはありませんが、実体が存在しない(nullである)オブジェクトnullObjectに対して、5行目でtoString()メソッドを呼び出しているため、このJSPプログラムでは実行時にNullPointerExceptionが発生します。
次に、実際にエラーが発生した場合に表示される error_page.jsp を次のように作成してみます。
1: <%@ page isErrorPage="true" contentType="text/html; charset=euc-jp" %> 2: <% 3: // リモートIPアドレスがローカルIPでなかったら errro_message.jsp へ転送 4: if(!request.getRemoteAddr().startsWith("192.168.")) { 5: %><jsp:forward page="error_message.jsp" /><% 6: } 7: %> 8: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 9: <html> 10: <head> 11: <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> 12: <title>エラー</title> 13: </head> 14: <body> 15: 次のようなエラーが発生しました。 16: <b><%= exception %></b><br> 17: <hr> 18: <pre> 19: <% exception.printStackTrace(new java.io.PrintWriter(out)); %> 20: </pre> 21: </body> 22: </html>
エラーが発生したときに表示されるページとして使用されるJSPページでは、ディレクティブに
isErrorPage="true"
の記述を行います。
これにより、発生したエラーがexceptionという暗黙オブジェクトに設定されます。このオブジェクトを参照することでエラーの内容を知ることができます。
error_page.jspでは、リクエストのリモートIPアドレスを取得し、それが「192.168.」で始まる場合はローカルアドレスであると判断し、エラーの詳細を表示するための処理を行います。そうでない場合は、外部からのアクセスであると認識し、5行目でerror_message.jspへ処理を転送することで、一般ユーザー向けのエラーメッセージを表示します。
エラーの内容は16行目で表示し、
16: <b><%= exception %></b><br>
その詳細はexceptionオブジェクトのprintStackTrace メソッドにより、
19: <% exception.printStackTrace(new java.io.PrintWriter(out)); %>
のように出力させています。
外部からアクセスしているユーザーに対しては、error_message.jspという一般的なエラー表示用のページを表示させることにします。エラーの詳細はあえて表示せずに、管理者へ報告するように依頼します。このページは、次のような単純なHTML文として作成しました。
1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 2: <html> 3: <head> 4: <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> 5: <title>エラー</title> 6: </head> 7: <body> 8: エラーが発生しました。<br> 9: 管理者へ御報告ください。<br> 10: <br> 11: <a href="javascript:history.go(-1)">戻る</a> 12: </body> 13: </html>
以上のようにしてerror_test.jspへアクセスすると、ローカルアドレスからアクセスした場合に次のようなメッセージが表示されます。
外部からアクセスした場合には、次のようなメッセージが表示されます。
アクセス元のIPアドレスにより、表示するエラーの内容を切り替えることができました。
Copyright © ITmedia, Inc. All Rights Reserved.