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(サーバー内部エラー)のエラーページを設定。

次回は

サニタイジング。これでサンプルアプリは完成。

このブログの人気の投稿

1月29日(月)3、4コマ目

1月9日(火)1、2コマ目