✅ 本記事の目的
前回(Vol.11.3)では、Struts2のリクエスト処理における Interceptorの役割やdefaultStackの構成 を追ってきました。
今回はその延長として、「独自Interceptorを作成し、現場でどんな使い所があるのか?」を基礎から丁寧に解説していきます。
🤔 この記事でわかること:
- Interceptorの作成方法(最低限のコード)
struts.xml
での設定方法と使い方- defaultStack との関係
- 現場でよくあるユースケース(ログ・権限制御など)
🎯 Interceptorは何に使える?
Interceptorは、Struts2のリクエスト処理を横断的に拡張できる仕組みです。
以下のような処理に使うことで、アクションクラスをスリムに保ちつつ共通処理を集中管理できます。
代表ユースケース | 内容 |
---|---|
ログ記録 | アクション名、実行時間、ユーザー情報のログ化など |
認証・認可 | ログインチェック、管理者権限チェックなど |
前処理・後処理 | リクエストの正規化、セッション初期化、パラメータ検証など |
🛠️ 独自Interceptorの実装
まず、Interceptorは以下のように com.opensymphony.xwork2.interceptor.Interceptor
を実装します:
public class LoggingInterceptor implements Interceptor {
@Override
public void init() {
// 初期化処理(任意)
}
@Override
public void destroy() {
// 終了処理(任意)
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
long start = System.currentTimeMillis();
String actionName = invocation.getProxy().getActionName();
System.out.println("開始: " + actionName);
String result = invocation.invoke(); // 次のInterceptor or アクションを呼び出す
long end = System.currentTimeMillis();
System.out.println("終了: " + actionName + " 実行時間: " + (end - start) + "ms");
return result;
}
}
===
⚙️ struts.xml に登録する
作成したInterceptorを使うには、struts.xml
で以下のように登録します。
<!-- ① Interceptor定義 -->
<interceptors>
<interceptor name="loggingInterceptor" class="com.example.interceptor.LoggingInterceptor"/>
<interceptor-stack name="customStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="loggingInterceptor"/>
</interceptor-stack>
</interceptors>
<!-- ② アクションに適用 -->
<action name="hello" class="com.example.action.HelloAction">
<interceptor-ref name="customStack"/>
<result name="success">/hello.jsp</result>
</action>
🔎 defaultStackを拡張する形で登録するのが一般的です。
💡 よくある使い所ベスト3(業務で役立つ)
用途 | ポイント例 |
---|---|
ログ記録 | ログ集約、ユーザー操作の監査ログ出力など |
ログイン状態チェック |
session.get("user") を使った簡易認証 |
アクションの実行時間測定 | パフォーマンス分析やトラブルシュートに |
🧱 設計のコツとベストプラクティス
-
✅ 複数のInterceptorに責務を分離して小さく保つ(1 Interceptor = 1責務)
-
✅ 汎用的なものはスタック化して struts.xml に共通定義
-
✅ ロジックが複雑になる場合は InterceptorStack を使って分割適用
✅ まとめ
学んだこと | 内容 |
---|---|
Interceptorの役割 | アクション前後の横断処理を担う仕組み |
独自Interceptorの作成方法 |
intercept() をオーバーライド |
適用方法 |
struts.xml で interceptor 定義と interceptor-ref 設定 |
defaultStackとの関係 | defaultStackを拡張して使うのが安全・推奨 |
📌 次回予告(Vol.11.13)
Vol.11.13では、Interceptorを複数つなげて「Interceptorチェーン」を実装する応用編に進みます。
ログ記録 → 認証 → セッションチェックなど、実務でも通用するInterceptor連携設計を解説します!
🧭 シリーズリンク
-
(この記事)Vol.11.3.2 独自Interceptorの作り方と使い所
-
🔜 Vol.11.13 Interceptorチェーンを自作してみよう(ログ / 認証フィルタ)
📘 本記事が役立った場合は、ストック・いいね・フォローしていただけると励みになります!
🧭 関連記事(Vol.11.xxxシリーズ)
連番 | タイトル | 内容分類 |
---|---|---|
Vol.11.0 | Struts2が提供してくれる便利機能まとめ9選 | 導入&概要 |
Vol.11.1 | 自動注入とステートレスActionの仕組み | フレームワーク内部理解 |
Vol.11.2 | UX改善に効く!アクション層設計と入力制御の極意(プロローグ) | UX設計・アクション層総論 |
Vol.11.2.1 | 【実践編】Struts2アクション層の役割と設計パターン(Command型 / UIアクション分離など) | アクション設計パターン |
Vol.11.2.2 | 【UX重視】戻るボタン・キャンセル処理の設計手法と「戻り先管理」のスマート実装 | 戻り先制御とUX設計 |
Vol.11.2.3 | 【設計ノウハウ】多画面遷移時のパラメータ受け渡し・保持戦略(セッション vs hidden vs URL) | パラメータ多重管理 |
Vol.11.2.4 | 【実践ガイド】ユーザー操作を考慮したアクション遷移設計(リダイレクト vs フォワードの使い分け) | UX遷移設計/Result制御 |
Vol.11.2.5 | 【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計 | アクション共通化/保守性 |
Vol.11.3 | Struts2の defaultStack とは?Interceptorの中身を詳しく追ってみる | Interceptor |
Vol.11.4 | 入門者のための「パラメータ自動バインディング」完全理解ガイド | 自動バインディング |
Vol.Vol.11.4.1 | 入門者のための自動バインディング実践パターン集 | 自動バインディング |
Vol.11.5 | Struts2の構成理解が“実務レベル”へと進化する決定版 | 設定ファイル構造 |
Vol.11.5.1 | Struts2の“画面遷移の全体像”を理解するためのマイルストーン記事 | 設定ファイル構造 |
Vol.11.6 | ActionSupport の便利メソッドと国際化対応 | ユーティリティ / i18n |
Vol.11.7 | validate() / input 戦略とUX設計 | 開発スタイルの違い |
Vol.11.8 | アノテーションベースの設定 vs XML定義の比較 | 開発スタイルの違い |
Vol.11.9 | バリデーション完全解説(XML / アノテーション) | バリデーション(※Vol.8補完) |
Vol.11.10 | Struts2の「OGNL」ってなに?しくみと使い方をやさしく解説 | 式言語OGNL解説 |
Vol.11.11 | ModelDriven インターフェースの使いどころと注意点 | Model駆動開発 |
Vol.11.12 | SessionAware と RequestAware でセッション/リクエスト管理 | セッション管理 |
Vol.11.13 | Resultタイプ完全解説(dispatcher / redirect / stream など) | 遷移パターン理解 |
Vol.11.14 | Vol.11.14 ValueStackの中身を理解する – 画面とActionの橋渡し役 | Action |
Vol.11.15 | Interceptorチェーンを自作してみよう(ログ / 認証フィルタ) | Interceptor |
Vol.11.16 | エラー処理と例外ハンドリングの実践パターン | ハンドリング設計 |
Vol.11.17 | Struts2でファイルアップロード機能を実装する方法 | 実装系Tips |
Vol.11.18 | 非同期通信(AJAX)とStruts2の連携方法 | フロント連携編 |
Vol.11.19 | セキュリティ対策(CSRF, XSS, パラメータ偽装) | セキュリティ対策 |
Vol.11.20 | 複数フォームを安全に扱う!セッション管理と動的フォームの考え方 | セッション管理 |
Vol.11.21 | Struts2でJSONを返す!REST API連携と非同期通信の基本設計 | セッション管理 |
Vol.11.22 | 本番環境構成とセキュリティ設計(Apache+Tomcat+Struts2連携) | 外部公開 |