Servlet/JSP 基礎編11 フィルタ

フィルタとは

サーブレットJSPを実行する前後に指定した処理を実行するための機能のことである。これをうまく使うと、共通処理を記述することで、全体のコード量を減らすことができる。
具体的に共通の処理というのは、レスポンスに対する文字エンコーディングMIMEタイプ設定、逆にリクエストの文字エンコーディングなどがある。

フィルタを作成するために

フィルタを作成するためには、Filterインタフェースを実装したクラスを宣言しなければならない。まず、Filterインターフェースには、3つのメソッドが提供されており、必ず、オーバーライドしなければならない。
その3つのメソッドというのは、「doFilter」「init」「destroy」である。doFilterメソッドは、フィルタ適用時に呼び出される。initメソッドは開始時に一度、destroyメソッドは終了時に一度呼び出される。文字で書いても、理解が追い付かないと思うので、プログラムの中で詳しく書いていこうとおもう。
プログラムを作成する前に、最後、このフィルタの適用範囲を設定する。これは、Webアノテーションのように記述すればよい。正しくは、WebFilterアノテーションである。

プログラムの作成

実際のフィルタ部分のプログラムは以下である。

 
@WebFilter(urlPatterns={"/*"})
public class EncodingFilter implements Filter {

    public void doFilter(ServletRequest request , ServletResponse response
     , FilterChain chainthrows IOException , ServletException{
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        System.out.println("フィルタの前処理");

        chain.doFilter(request,response);
        System.out.println("フィルタの後処理");
    } 

    public void init(FilterConfig filterConfig){}
    public void destroy(){}
}

 まず、1行目がWebFilterアノテーションである。URLパターンに「/*」と指定しているので、これから先の作成するサーブレットJSP、すべてにこのフィルタが適用されることになる。

次に、doFilterメソッドを見てほしい。引数の中に、request,responseと、chainというものがある。これは、FilterChainインタフェースのインスタンスである。このchainを用いて、フィルタの終了時に行う後処理を記述することができる。

このメソッドの中では、リクエストとレスポンスのエンコーディングなどを設定している。そして、「chain.doFilter(request,response)」と書かれている。一見、引数の数が少ないと思うだろうが、これは、FilterChainインタフェースのdoFilterメソッドであり、先ほどのものとは別物である。これを書くことで、フィルタの後ろ側にある、サーブレットJSPにリクエスト、レスポンス内容を送ることができる。逆に言うと、この処理がなければ、フィルタでリクエストが遮断されてしまう。

分かりにくいと思うので、図で表す。

f:id:kouki-matsuura:20200901210408p:plain

最もシンプルに表すと上図のようになる。これで、「フィルタの後ろ側にあるサーブレットJSP」や「フィルタでリクエストが遮断されてしまう」という意味が理解できると思う。

続きを解説する。initメソッド、destroyメソッドは、特に何も目的がないので、宣言だけをする。

あとは、適当なサーブレットを用意する。サーブレットのプログラムは以下である。

@WebServlet(urlPatterns={"/chapter10/filter-sample"})
public class FilterSample extends HttpServlet{

    public void doGet(HttpServletRequest request , HttpServletResponse response
    throws ServletException , IOException{
        System.out.print("サーブレットの処理");
    }
}

シンプルに「サーブレットの処理」と画面にでるようにした。

結果は以下である。

 

フィルタの前処理
サーブレットの処理
フィルタの後処理

 

まず、フィルタのプログラムで前処理が行われており、サーブレットの処理、戻ってきて、後処理が行われていることが分かる。今までのプログラムなら、文字化けが起きるはずだが、フィルタを通すことで、文字化けを防げている。

今後は、エンコーディングのことを気にせず、プログラムを書くことができる。

おわりに

今回は「フィルタ」について簡単に紹介してきた。以上で、「サーブレットJSP 基礎編」は終わりである。次回からは「応用編」として、サーブレットJSPだけでなく、データベースなど、本格的にWEBアプリケーションに使われている機能に触れていきたいと思う。