1月6日(水)1コマ目
今日、やったこと
フィルター
今日のホワイトボード
2020年末からのつづきです。「安全なWebアプリケーション構築」というタイトルで、認証を行うアプリケーションを構築してきました。
作成途中のWebアプリケーションをリハビリがてら以下のように改造してもらいました。
|
| 図 改造内容 |
いちおう、ソースコードです。
IndexSrvクラス(サーブレット)
doPost()で認証OKなら
[改造前]/WEB-INF/userinfo.jspへフォワード
[改造後]SecondPageSrvへリダイレクト
に改造。これで認証成功ならクライアントはSecondPageSrvへリダイレクトさせられる。
リダイレクト=>クライアントはリダイレクト先を再度リクエストする。
SecondPageSrvクラス(サーブレット)
追加。
doGet()で/WEB-INF/userinfo.jspへフォワード。
クライアントが直接アクセス可能?不可能?
主にJSPやHTMLファイルですが、どこに置くか(WebContentフォルダかWEB-INFフォルダか) で、ブラウザからアクセスできる、できないのコントロールができます。
|
| 図 クライアントが直接アクセス可能?不可能? |
WEB-INF以下に置いたJSP(HTMLも)はブラウザから直接アクセスできません。
WEB-INF以下のJSPの表示はサーブレット内でフォワードすることになります。
未ログインならログインページに飛ばしたい
ブラウザのアドレスに2ページ目のURL(http://xxx/SecondPageSrv)を入力すると、ログインページを経由せずに2ページ目にアクセスできます。
このような未ログインの状態でログインページ以外をリクエストした場合、ログインページに飛ばしたいです。
これを実現するにはサーブレット実行前に実行されるフィルターを使って、ログイン済みかチェックすれば可能です。
![]() |
| 図 フィルターで未ログインならIndexSrvへとばす |
AuthFilterクラス(フィルター)
Eclipseなら「新規」->「フィルター」で追加可能。
フィルターのポイント
doFilter()メソッドがメインの処理
ここにフィルターで実行したいことを書きます。今回ならログイン済みか否かのチェックです。
Sessionオブジェクトにアクセスしたい
doFilter()メソッドの引数はServletRequest型(インタフェース)、ServletResponse型(インタフェース)です。
ちなみにサーブレットの引数はHttpServletRequest型(インタフェース)、HttpServletResponse型(インタフェース)です。
HttpServletRequestはSerlvetRequestのサブインタフェース、HttpServletResponseはServletResponseのサブインタフェースです。
フィルターの2つの引数をHttpServeltRequest、HttpServletResponseへキャストすることで、サーブレットと同じように2つの引数を扱うことができます。Sessionオブジェクトの取得もできます。
フィルターは複数をつなげることができる
複数のフィルターを繋げた「フィルターチェーン」を作ることができます。
と言ってもやることは
- フィルタークラス作成
- doFilter()の最後でchain.doFilter()呼び出し
だけです。
フィルターを実行する、しない
リクエストするURLによってフィルターを実行する、実行しないを決めることができます。
@WebFilterアノテーションで「urlPatterns」を使ってフィルターを実行するURLを指定します。
例1)SecondPageSrvリクエスト時にフィルター実行
@WebFilter(urlPatterns="/SecondPageSrv")
例2)SecondPageSrv、ThirdPageSrvリクエスト時にフィルター実行
@WebFilter(urlPatterns={"/SecondPageSrv", "ThirdPageSrv"})
※{ }があります



コメント