2015年6月30日火曜日

Spring で Filter を使う方法

概要

Spring Framework で Java のサーブレットの Filter を使ってみました

環境

  • Mac OS X 10.10.3
  • Eclipse Luna 4.4.1
  • Spring Framework 4.1.6
  • Spring Tool Suite 3.6.4
  • Java 1.8.0_31
  • Maven 3.2.1

サンプルプロジェクト作成

過去の記事を参考に作成してください
Spring Framework のバージョンが最新でない場合は pom.xml 「org.springframework-version」のバージョン記載部分を最新のバージョンに変更してください

Filterクラスの実行

今回は以下にクラスを作成することにします
src/main/java/com/sample/TestFilter.java
Javaのサーブレットのjavax.servlet.Filterを implements したクラスを作成します
今回は単純に doFilter 内でデバッグログを出力するようにします

package com.sample;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class TestFilter implements Filter {

  public TestFilter() {
  }

  @Override
  public void destroy() {
  }

  @Override
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    System.out.println("start");
    chain.doFilter(req, res);
    System.out.println("end");
  }

  @Override
  public void init(FilterConfig arg0) throws ServletException {
  }
}

Filterの有効化

Filterを有効にするにはweb.xmlを修正します
STSでプロジェクトを作成した場合にはsrc/main/webapp/WEB-INF/web.xmlに以下を追記します

<filter>
  <filter-name>testFilter</filter-name>
  <filter-class>com.sample.TestFilter</filter-class>
</filter>
  <filter-mapping>
  <filter-name>testFilter</filter-name>
  <url-pattern>/</url-pattern>
</filter-mapping>

<web-app>配下に記載すればOKです

動作確認

プロジェクトを右クリックして「Run on Server」で起動しましょう
ブラウザで「http://localhost:8080/sample」とかにアクセスしてみましょう
com.sample.HomeControllerに定義してある @RequestMapping が実行する想定です

コンソールに以下のように表示されれば Filter が有効になっています

start
INFO : com.sample.sample.HomeController - Welcome home! The client locale is ja_JP.
end

start - end が Filter で出力しているデバッグ文でメイン処理の前に start が出力され、メイン処理の後に end が出力されていることがわかると思います

最後に

前に Spring で Interceptor を使う方法を紹介しましたが、Interceptor と Filter の使い分けとしては

  • Interceptor はあるメソッドの前後で実行される処理を定義して
  • Filter はある RequestMapping の前後で実行される処理を定義する

のが違いかなと思っています
粒度的には Interceptor のほうが細かい感じかなと思います
(違っていたらすいません、突っ込みお願いします)

0 件のコメント:

コメントを投稿