Jakarta サーブレットフィルタの仕組みと利用例を徹底解説!初心者でもわかるリクエスト処理の基本
生徒
「先生、Jakarta サーブレットでフィルタって何に使うんですか?リクエストやレスポンスを処理する仕組みと関係あるんですか?」
先生
「いい質問だね。Jakarta サーブレットフィルタは、リクエストやレスポンスの前後に処理を挟み込む仕組みなんだ。認証チェックやログ記録、文字エンコーディングの設定などによく使われるよ。」
生徒
「なるほど!つまりサーブレットが処理を始める前や、レスポンスを返す直前に便利な処理を追加できるってことですね。」
先生
「そうだね。では具体的にJakarta サーブレットフィルタの仕組みと利用例を見ていこう。」
1. Jakarta サーブレットフィルタとは
Jakarta サーブレットフィルタは、Jakarta EE のサーブレット仕様に含まれる仕組みで、リクエストとレスポンスに対して追加の処理を差し込む役割を持ちます。フィルタはjakarta.servlet.Filterインターフェースを実装して作成します。例えばログの記録、認証チェック、文字コードの設定、レスポンスの圧縮など、共通的な処理を集中して記述することができます。
2. Jakarta サーブレットフィルタの基本構造
フィルタは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 LoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("LoggingFilter initialized");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Request received at: " + System.currentTimeMillis());
chain.doFilter(request, response);
System.out.println("Response sent at: " + System.currentTimeMillis());
}
@Override
public void destroy() {
System.out.println("LoggingFilter destroyed");
}
}
3. web.xml によるフィルタの設定
Jakarta サーブレットフィルタはweb.xmlで設定することもできます。特定のURLパターンに対してフィルタを適用できるため、柔軟にコントロールが可能です。
<filter>
<filter-name>LoggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoggingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. アノテーションによるフィルタ設定
Jakarta EE ではアノテーションを使って簡単にフィルタを登録することもできます。@WebFilterを利用すれば、コード内で直接URLパターンを指定可能です。
import jakarta.servlet.annotation.WebFilter;
@WebFilter("/*")
public class LoggingFilter implements Filter {
// doFilterメソッドの実装は先ほどと同じ
}
5. フィルタの代表的な利用例
Jakarta サーブレットフィルタの利用例はいくつもあります。以下のようなケースで頻繁に使われます。
- ログ出力:アクセス時刻やユーザー情報を記録する
- 認証・認可チェック:ログイン済みかどうかを確認する
- 文字エンコーディング設定:
request.setCharacterEncoding("UTF-8")の統一処理 - レスポンス圧縮:HTMLやJSONをGZIPで圧縮して送信
- キャッシュ制御:ヘッダーを設定してブラウザキャッシュを制御
6. 実際の動作例
例えばログ出力フィルタを適用した場合、アクセス時に以下のようなコンソール出力が得られます。
LoggingFilter initialized
Request received at: 1695371893000
Response sent at: 1695371893500
7. フィルタを使うメリット
Jakarta サーブレットフィルタを利用する最大のメリットは、アプリケーション全体で共通処理をまとめられることです。個々のサーブレットに同じ処理を何度も書く必要がなくなり、保守性や可読性が大幅に向上します。また、セキュリティ対策やパフォーマンス最適化の観点からも重要な仕組みです。
まとめ
Jakarta サーブレットフィルタは、ウェブアプリケーションの基盤として働く大切な仕組みであり、リクエストとレスポンスに対して柔軟に処理を追加できる非常に便利な機能です。特に、認証や認可の確認、アクセスログの出力、文字エンコーディングの統一、キャッシュ制御、レスポンス圧縮など、さまざまな共通処理を効率よく組み込むことができる点が大きな魅力です。サーブレット内部に同じ処理を何度も記述すると複雑になりがちですが、フィルタを利用すればアプリケーション全体で共通化できるため、保守性と拡張性が格段に向上します。
また、Jakarta サーブレットフィルタはdoFilterメソッドによってリクエスト処理の前後に任意の処理を差し込むことができ、認証チェックやログ記録を必要なタイミングで確実に実行できます。web.xmlで細かくURLパターンを指定する方法のほか、@WebFilterアノテーションを利用した簡潔な設定方法も提供されており、小規模な開発から大規模なエンタープライズシステムまでスムーズに導入できます。
とくに多くの開発現場でよく採用されるのが、アクセスログの自動記録や文字エンコーディングの統一処理です。たとえば文字コードが統一されていないと、入力値が文字化けしたり日本語が正しく保存されないなどの問題につながりますが、フィルタで設定しておけば安心してアプリケーション全体の品質を保てます。また、認証チェックをフィルタに集約しておくことで、保護されたページに対するアクセス制御を一元管理でき、セキュリティ設計がより明確になります。
フィルタはJavaコードとして実装するため、自由度の高い処理や細かい条件分岐を記述することも可能です。以下にサンプルコードを示します。先に説明した内容の応用として、アクセス時にユーザーエージェントを取得してログに追加記録するフィルタ例を作成しています。
サンプルコード:ユーザーエージェントを含むログフィルタ
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 jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
public class UserAgentLoggingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("UserAgentLoggingFilter initialized");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String agent = req.getHeader("User-Agent");
System.out.println("アクセスユーザーエージェント: " + agent);
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("UserAgentLoggingFilter destroyed");
}
}
このように、フィルタは簡潔なコードで柔軟かつ強力な処理を追加できるため、多くの Jakarta サーブレットベースのシステムで重宝されています。URL パターンごとにフィルタを区別したり、複数のフィルタを順番に適用したり、より複雑な処理フローを構築することも可能です。フィルタチェーンを理解することで効率的なリクエスト制御が実現でき、システム全体の品質向上につながります。 また、レスポンスの加工やキャッシュ制御など、クライアント側の表示や挙動に影響を与える処理にも適しているため、ウェブアプリケーション開発の中核的な技術として覚えておく価値があります。初心者でも理解しやすい構造ながら、プロフェッショナルな開発でも不可欠な仕組みとなっており、今後さまざまなプロジェクトで役に立つ知識です。
生徒
「フィルタって最初は難しそうに感じていたけれど、実際にはすごく便利な仕組みなんですね。リクエストとレスポンスの前後に処理を差し込めるのが面白かったです。」
先生
「そのとおりだよ。サーブレット本体ではなくフィルタに共通処理を集めれば、コードがすっきりして全体の管理が楽になるんだ。特に認証チェックやログ出力の統一が効果的だね。」
生徒
「URLごとに適用するフィルタを変えられる点も便利ですね。大規模な開発でも役立ちそうだと思いました。」
先生
「URLパターンでの制御はとても重要だね。必要な処理だけ適用できるから効率的だし、セキュリティ対策にも活用できるんだよ。」
生徒
「アノテーションで設定できるのも便利でした。XMLよりコード内で完結するほうが作業がしやすいです。」
先生
「最近の Jakarta EE の流れとしてアノテーションはとても使いやすいね。どちらの設定方法も理解しておけば、プロジェクトの方針に合わせて柔軟に対応できるようになるよ。」