1月12日(金)1、2コマ目
今日、やったこと
エラーページ
フィルター
今日のホワイトボード
エラーページ
例外スローの結果、エラーページをそのまま出力すると危険。
このエラーページには
- サーバーの種類(Tomcat)、バージョン
- プログラミング言語
- DBの種類
等、色々な情報が含まれるため危険。
catchブロックを用意して、そのなかでエラーページを表示するようにすればいいが、Javaサーブレットにもデフォルトのエラーページを設定することができる。
|
| 図 エラーページの設定 |
①設定ファイルweb.xmlを設定
エラーの種類(HTTPのステータスコード別、Javaの例外別)、エラーページが設定できる。
②エラーページ作成
HTMLだけでなく、JSPも可。
なお、JSPでは暗黙オブジェクトexceptionが使える。exceptionはスローされた例外。
ただ、exceptionを使うにはエラーページであることを指定する必要あり。
エラーページへの遷移はフォワードで行われる。
よって、エラーページをWEB-INF/以下に置くことも可。
リダイレクトとフォワード
いずれもページ遷移の仕組みだが、以下の違いがある。
- フォワードはサーバー内で遷移先ページを読み込みクライアントへ返す=>1往復
- リダイレクトはステータスコード302をクライアントに返して、クライアントが再リクエスト=>2往復
|
| 図 フォワードは1往復で遷移 |
|
| 図 リダイレクトは2往復で遷移 |
認証成功後のページ追加
認証に成功するとユーザー情報を表示する。流れは下図のようになる。
|
| 図 サーブレットとページ表示のながれ |
エラー「レスポンスをコミットした後でリダイレクトできません」
認証に成功したとき、2ページ目(UserInfoSrv)にリダイレクトする。
ただ、プログラムは続きがあり、最終的にフォワードしている。これがエラーの原因。
|
| 図 エラー「レスポンスをコミットした後でリダイレクトできません」 |
リダイレクトしたらそこでdoPost()メソッドを終了させればいい。
いいやり方ではないが、リダイレクトのあとreturnでdoPost()から抜け出している。
認証済みユーザーのみ表示させたい
2ページ目のユーザー一覧は認証済みユーザーのみ表示させたい。
ブラウザに直接2ページ目のURLを入力してアクセスしても1ページ目(ログインページ)に飛ばしたい。
2ページ目表示の入り口になるサーブレット(UserInfoSrv)にアクセスしたとき、認証済みかチェックすればいい。これを実現するフィルターがある。
|
| 図 フィルターで認証済みかチェック |
フィルター
doFilter()メソッド内で認証済みかチェック実行。
ちょっとめんどくさいのはdoFilter()の引数request、responseがサーブレットと異なるところ。セッションオブジェクトの取得(getSession())、リダイレクト(sendRedirect())をするにはキャストが必要。
| 引数 | サーブレットでの型 | フィルターでの型 |
|---|---|---|
| request | HttpServletRequest | ServletRequest |
| response | HttpServletResponse | ServletResponse |
今日のソードコード
差分をあげておきます。
[dtoパッケージ]Userクラス
ユーザー情報受け渡し用クラス。
[daoパッケージ]UserDAOクラス
ユーザー情報取得用findByName()追加。
[bllパッケージ]Serviceクラス
ユーザー情報取得用getUser()追加。
中身はUserDAOのfindByName()呼び出しと例外処理だけ。
[bllパッケージ]PasswordUtilクラス
変更なし
[exceptionパッケージ]InvalidPassordException、NotFilledExceptionクラス
変更なし
[presentationパッケージ]IndexSrvクラス
認証成功時にユーザー情報取得、2ページ目への移動を追加。
[presentationパッケージ]UserInfoSrvクラス
2ページの入り口になるサーブレット。
doGet()でuserinfo.jspへフォワードするだけ。
[presentationパッケージ]AuthFilterクラス
認証済みかチェックをするフィルター。
サーブレットUserInfoSrvが呼び出されたとき、このフィルターが先に実行される。
[JSP]index.jsp
変更なし
[JSP]userinfo.jsp
2ページ目のユーザー情報表示用ページ。
[JSP]error_404.jsp
存在しないページがリクエストされたとき(ステータスコード404)に表示するエラーページ。表示自体は自動的にやってくれる。
[JSP]error_500.jsp
サーバー内部エラー(Javaのプログラム実行時のエラー)発生時(ステータスコード500)に表示するエラーページ。表示自体は自動的にやってくれる。
[設定ファイル]web.xml
ステータスコード404(存在しないページをリクエスト)、ステータスコード500(サーバー内部エラー)のエラーページを設定。
次回は
サニタイジング。これでサンプルアプリは完成。





