【Spring MVC】サーブレットフィルタの利用

概要

サーブレットフィルタの基本的な使用方法についてまとめた。
フィルタ処理を自作する方法や、Springが提供するサーブレットフィルタの利用方法について紹介する。

 

サーブレットフィルタ

サーブレットフィルタは、Webアプリケーションのリクエストとレスポンスの前後に共通処理を挟むための仕組みとなる。
認証、ログ記録、文字コード設定、アクセス制御などに利用される。

 

基本的な使い方

サーブレットフィルタは、基本的にjavax.servlet.Filterインターフェースを実装して以下のメソッドを適宜オーバーライドして使用する。

 

メソッド 説明
init(FilterConfig config) 初期化処理(フィルターの登録時に1回だけ呼ばれる)
doFilter(ServletRequest req, ServletResponse res, FilterChain chain) フィルターの中心的な処理を担うメソッド
chain.doFilter() を呼ぶことで、次のフィルターやServletに処理を渡す
destroy() 終了処理(アプリケーション停止時に1回だけ呼ばれる)

 

実装方法

基本的なフィルター処理を実装する方法を紹介する。

 

フィルタークラス作成

フィルタークラスを定義する。

SpringServletFilter.java


package com.example.prototype.web.filter;

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;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SpringServletFilter implements Filter {

	private static final Logger logger = LoggerFactory.getLogger(SpringServletFilter.class);
	
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初期化処理(フィルターが初めて作成されるときに1回だけ呼び出される)
    	logger.info("★★初期化処理★★");
    }
    
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
        // 前処理
		logger.info("★★リクエストがアプリに届く前★★");
		// アプリケーションに処理を渡す
        chain.doFilter(request, response);
        // 後処理
        logger.info("★★サーブレットがレスポンスを生成して返却後★★");
	}
	
	@Override
	public void destroy() {
	    // アプリ終了時の処理
		logger.info("★★アプリ終了時の処理★★");
	}
}

 

// 前処理
logger.info(“★★リクエストがアプリに届く前★★”);
// アプリケーションに処理を渡す
chain.doFilter(request, response);
// 後処理
logger.info(“★★サーブレットがレスポンスを生成して返却後★★”);

chain.doFilter()メソッドの前後に、リクエストとレスポンスに関する共通処理を実装する。

 

web.xmlにマッピング

定義したフィルター情報をweb.xmlにマッピングする。
これにより、作成したフィルタが有効となる。

web.xml


<filter>
	<filter-name>springServletFilter</filter-name>
	<filter-class>com.example.prototype.web.filter.SpringServletFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>springServletFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

 

<filter-name>springServletFilter</filter-name>
<url-pattern>/*</url-pattern>

コンテキストルートに続くすべてのリクエストパスに対して、springServletFilterを有効にしている。

 

Spring提供のサーブレットフィルタ

Springが提供するサーブレットフィルターの一つ、ServletContextRequestLoggingFilterの使用例を紹介する。

 

ServletContextRequestLoggingFilter

ServletContextRequestLoggingFilterは、javax.servlet.Filterをラップしており、HTTPリクエストの内容をログ出力するためのフィルターとなる。
SpringのDIコンテナにBeanを登録し、web.xmlにBeanをマッピングすることで簡単に導入できる。

 

Bean定義

ServletContextRequestLoggingFilterをルートアプリケーションコンテキストにBean定義し、出力させたい内容を設定する。

※フィルタはWebアプリケーションコンテキスト(DispatcherServlet配下)よりも前に動作するため、ルートアプリケーションコンテキストにBean定義すること

applicationContext.xml


<!-- ServletContextRequestLoggingFilterのBean定義 -->
<bean id="requestLoggingFilter"
	class="org.springframework.web.filter.ServletContextRequestLoggingFilter">
	<property name="includeQueryString" value="true" />
	<property name="includePayload" value="true" />
	<property name="maxPayloadLength" value="1000" />
	<property name="includeHeaders" value="true" />
	<property name="afterMessagePrefix" value="REQUEST DATA : " />
</bean>

 

<property name=”includeQueryString” value=”true” />

クエリ文字列(例:?id=123など)のログ出力設定。

 

<property name=”includePayload” value=”true” />

リクエストボディのログ出力設定。

 

<property name=”maxPayloadLength” value=”1000” />

ログに出力するリクエストボディの最大文字数。

 

<property name=”includeHeaders” value=”true” />

HTTPヘッダー(User-Agentなど)のログ出力設定。

 

<property name=”afterMessagePrefix” value=”REQUEST DATA : ” />

ログ出力のプレフィックス文字列。

 

web.xmlにマッピング

定義したBeanのIDをweb.xmlにマッピングする。
これにより、DIコンテナに登録したフィルタが有効となる。

web.xml


<filter>
	<filter-name>requestLoggingFilter</filter-name>
	<filter-class>org.springframework.web.filter.DelegatingFilterProxy
	</filter-class>
</filter>

<filter-mapping>
	<filter-name>requestLoggingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

 

 

まとめ

 

☑ フィルタは、リクエストとレスポンスの前後に共通処理を挟める仕組みで、認証・ログ・処理時間計測などに活用できる

☑ サーブレットフィルタはweb.xmlに<filter>と<filter-mapping>を定義することで、サーブレットコンテナに登録して使用する

☑ Springが提供するフィルタをDIコンテナ経由で使う場合は、ルートアプリケーションコンテキストにBean定義する

スポンサーリンク