JakartaEE サーブレットフィルタとは?役割と仕組みを初心者向けに徹底解説
生徒
「先生、JakartaEEのサーブレットフィルタって聞いたことがあるんですが、具体的に何をする仕組みなんですか?」
先生
「サーブレットフィルタは、リクエストやレスポンスの処理を横からはさんで制御できる仕組みなんだ。例えば文字コード設定やログ記録、セキュリティチェックなどを行えるよ。」
生徒
「なるほど!じゃあサーブレットの前後で処理を追加するようなイメージですか?」
先生
「その通りだよ。サーブレットフィルタはWebアプリケーションに欠かせない機能で、効率的に共通処理をまとめられる便利な仕組みなんだ。」
1. サーブレットフィルタとは?
JakartaEE サーブレットフィルタとは、サーブレットに到達するリクエストやサーブレットから返されるレスポンスに対して前処理や後処理を挟み込むための仕組みです。セキュリティ認証やログ記録、リクエストの圧縮やレスポンスの変換などを一元的に実装できるため、大規模なWebアプリケーションで非常に役立ちます。
2. フィルタの基本的な流れ
フィルタはdoFilterメソッドを中心に動作します。具体的には以下の流れになります。
- リクエストがWebサーバーに届く
- フィルタが実行され、前処理を行う
- サーブレットに処理が渡る
- サーブレットがレスポンスを生成する
- フィルタが後処理を行い、クライアントに返す
このように、サーブレットフィルタは処理の前後に割り込んで共通機能を提供します。
3. サーブレットフィルタの実装方法
サーブレットフィルタを実装するには、Filterインターフェースを実装します。そしてdoFilterメソッド内でリクエストやレスポンスを操作します。
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import java.io.IOException;
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初期化処理
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
System.out.println("フィルタで文字コードを設定しました");
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 終了処理
}
}
この例では文字コードをUTF-8に統一するフィルタを実装しています。サーブレットに処理を渡すためにchain.doFilter()を呼び出すことが重要です。
4. web.xmlでのフィルタ設定
フィルタを利用するには、web.xmlに定義を追加します。対象となるURLパターンを指定することで、特定のリクエストにだけフィルタを適用できます。
<web-app>
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>example.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
ここでは全てのリクエストに対してEncodingFilterを適用しています。
5. アノテーションによるフィルタ設定
JakartaEE ではアノテーションを使ってフィルタを設定することも可能です。@WebFilterを指定すれば、web.xmlなしで簡単に導入できます。
import jakarta.servlet.annotation.WebFilter;
@WebFilter("/*")
public class EncodingFilter implements Filter {
// 実装部分は先ほどと同様
}
小規模なアプリケーションや簡単な検証では、アノテーションでの設定が便利です。
6. サーブレットフィルタの活用例
サーブレットフィルタは様々な場面で活用できます。代表的な例としては以下のようなものがあります。
- アクセスログの記録
- 認証や認可のチェック
- レスポンスの圧縮(GZIPなど)
- クロスサイトスクリプト(XSS)対策
- IPアドレス制限やアクセス制御
これらの処理を個々のサーブレットに書くとコードが煩雑になりますが、フィルタにまとめれば共通処理として一括管理できます。
7. サーブレットフィルタ理解のメリット
サーブレットフィルタを理解すると、Webアプリケーションの設計が大幅に効率化します。例えばセキュリティ対策やパフォーマンス改善を後から追加したいとき、フィルタを導入するだけで全体に反映できます。JakartaEE を学ぶ初心者にとって、サーブレットフィルタは重要なステップの一つです。