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"})

※{ }があります

コメント

このブログの人気の投稿

11月25日(水)1コマ目

10月14日(水)1コマ目