🔧 Vol.11.3.2 独自Interceptorの作り方と使い所   _Struts2のカスタマイズを“実践で使えるレベル”に一歩進めよう_

## ✅ 本記事の目的

前回（Vol.11.3）では、Struts2のリクエスト処理における **Interceptorの役割やdefaultStackの構成** を追ってきました。

今回はその延長として、「**独自Interceptorを作成し、現場でどんな使い所があるのか？**」を基礎から丁寧に解説していきます。

> 🤔 この記事でわかること：
> - Interceptorの作成方法（最低限のコード）
> - `struts.xml` での設定方法と使い方
> - defaultStack との関係
> - 現場でよくあるユースケース（ログ・権限制御など）

---

## 🎯 Interceptorは何に使える？

Interceptorは、Struts2の**リクエスト処理を横断的に拡張できる仕組み**です。  
以下のような処理に使うことで、**アクションクラスをスリムに保ちつつ共通処理を集中管理**できます。

| 代表ユースケース | 内容 |
|----------------|------|
| ログ記録        | アクション名、実行時間、ユーザー情報のログ化など |
| 認証・認可      | ログインチェック、管理者権限チェックなど |
| 前処理・後処理   | リクエストの正規化、セッション初期化、パラメータ検証など |

---

## 🛠️ 独自Interceptorの実装

まず、Interceptorは以下のように `com.opensymphony.xwork2.interceptor.Interceptor` を実装します：

```java
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`で以下のように登録します。

<package name="default" extends="struts-default">

    <!-- ① 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>

</package>


### 🔎 **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 Struts2の defaultStack とは？Interceptorの中身を詳しく追ってみる](https://qiita.com/juehara-crypto/items/913de7c942a9242201e8)

- ***（この記事）Vol.11.3.2 独自Interceptorの作り方と使い所***

- 🔜 Vol.11.13 Interceptorチェーンを自作してみよう（ログ / 認証フィルタ）

📘 本記事が役立った場合は、ストック・いいね・フォローしていただけると励みになります！


---

### 🧭 関連記事（Vol.11.xxxシリーズ）
| 連番           | タイトル                                                  | 内容分類              |
| ------------ | ----------------------------------------------------- | ----------------- |
| [Vol.11.0](https://qiita.com/juehara-crypto/items/a0cc66893cb499a6e23a)     | Struts2が提供してくれる便利機能まとめ9選                              | 導入＆概要             |
| [Vol.11.1](https://qiita.com/juehara-crypto/items/0a584da537059dd43a7c)     | 自動注入とステートレスActionの仕組み                                 | フレームワーク内部理解       |
| [Vol.11.2](https://qiita.com/juehara-crypto/items/c69962826bb29639c351) | **UX改善に効く！アクション層設計と入力制御の極意（プロローグ）**                   | UX設計・アクション層総論     |
| [Vol.11.2.1](https://qiita.com/juehara-crypto/items/9ca115073e6f928c7f71)   | 【実践編】Struts2アクション層の役割と設計パターン（Command型 / UIアクション分離など）  | アクション設計パターン       |
| [Vol.11.2.2](https://qiita.com/juehara-crypto/items/88b7634a64b1ad564668)   | 【UX重視】戻るボタン・キャンセル処理の設計手法と「戻り先管理」のスマート実装               | 戻り先制御とUX設計        |
| [Vol.11.2.3](https://qiita.com/juehara-crypto/items/c5165c92a4366fd1962b)   | 【設計ノウハウ】多画面遷移時のパラメータ受け渡し・保持戦略（セッション vs hidden vs URL） | パラメータ多重管理         |
| [Vol.11.2.4](https://qiita.com/juehara-crypto/items/06162659215cca86de28)   | 【実践ガイド】ユーザー操作を考慮したアクション遷移設計（リダイレクト vs フォワードの使い分け）     | UX遷移設計／Result制御   |
| [Vol.11.2.5](https://qiita.com/juehara-crypto/items/b538b50eaa9c263a31bb)   | 【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計               | アクション共通化／保守性      |
| [Vol.11.3](https://qiita.com/juehara-crypto/items/913de7c942a9242201e8)     | Struts2の defaultStack とは？Interceptorの中身を詳しく追ってみる      | Interceptor       |
| [Vol.11.4](https://qiita.com/juehara-crypto/items/253142d13fe5f604610f)     | 入門者のための「パラメータ自動バインディング」完全理解ガイド                        | 自動バインディング         |
| [Vol.Vol.11.4.1](https://qiita.com/juehara-crypto/items/4fd8ed2a8be317f6e1bd)     | 入門者のための自動バインディング実践パターン集                        | 自動バインディング         |
| [Vol.11.5](https://qiita.com/juehara-crypto/items/6ef7a87a54163d81a9ba)     | Struts2の構成理解が“実務レベル”へと進化する決定版         | 設定ファイル構造          |
| [Vol.11.5.1](https://qiita.com/juehara-crypto/items/df407b24101e92a02eab)     | Struts2の“画面遷移の全体像”を理解するためのマイルストーン記事         | 設定ファイル構造          |
| [Vol.11.6](https://qiita.com/juehara-crypto/items/bfbdc2203acac7ba3f19)     | ActionSupport の便利メソッドと国際化対応                           | ユーティリティ / i18n    |
| [Vol.11.7](https://qiita.com/juehara-crypto/items/ed8f0977c23ee8c8b959)     | validate() / input 戦略とUX設計                            | 開発スタイルの違い    
| [Vol.11.8](https://qiita.com/juehara-crypto/items/bb2b23612c22fa9bf50b)     | アノテーションベースの設定 vs XML定義の比較                             | 開発スタイルの違い         |
| [Vol.11.9](https://qiita.com/juehara-crypto/items/6163ad6c9308cc8dda6d)     | バリデーション完全解説（XML / アノテーション）                            | バリデーション（※Vol.8補完） |
| [Vol.11.10](https://qiita.com/juehara-crypto/items/207cb3d7f0a889c54df9)     | Struts2の「OGNL」ってなに？しくみと使い方をやさしく解説                     | 式言語OGNL解説         |
| [Vol.11.11](https://qiita.com/juehara-crypto/items/c313ea56f97984756c05)    | ModelDriven インターフェースの使いどころと注意点                        | Model駆動開発         |
| [Vol.11.12](https://qiita.com/juehara-crypto/items/de7a17d53e53d6466f17)    | SessionAware と RequestAware でセッション/リクエスト管理            | セッション管理           |
| [Vol.11.13](https://qiita.com/juehara-crypto/items/539bd5bae75a8e154753)    | Resultタイプ完全解説（dispatcher / redirect / stream など）      | 遷移パターン理解          |
| [Vol.11.14](https://qiita.com/juehara-crypto/items/142d9aa2c623c5eb70bc)    | Vol.11.14 ValueStackの中身を理解する – 画面とActionの橋渡し役                 | Action            |
| [Vol.11.15](https://qiita.com/juehara-crypto/items/84f024816d0cf2212cb6)    | Interceptorチェーンを自作してみよう（ログ / 認証フィルタ）                 | Interceptor            |
| [Vol.11.16](https://qiita.com/juehara-crypto/items/ff3ad75f9ee45fcd0f8f)    | エラー処理と例外ハンドリングの実践パターン                                 | ハンドリング設計          |
| [Vol.11.17](https://qiita.com/juehara-crypto/items/0d8d5101ff39b34b4704)    | Struts2でファイルアップロード機能を実装する方法                           | 実装系Tips           |
| [Vol.11.18](https://qiita.com/juehara-crypto/items/d93c8d9cee719997c068)    | 非同期通信（AJAX）とStruts2の連携方法                              | フロント連携編           |
| [Vol.11.19](https://qiita.com/juehara-crypto/items/dd6cf06d3100c9204d1f)    | セキュリティ対策（CSRF, XSS, パラメータ偽装）                              | セキュリティ対策           |
| [Vol.11.20](https://qiita.com/juehara-crypto/items/9442d9f4705f1c6c4da1)    | 複数フォームを安全に扱う！セッション管理と動的フォームの考え方                              | セッション管理           |
| [Vol.11.21](https://qiita.com/juehara-crypto/items/78eb217727b7c97f228a)    | Struts2でJSONを返す！REST API連携と非同期通信の基本設計                              | セッション管理           |
| [Vol.11.22](https://qiita.com/juehara-crypto/items/424155ee0e567a36b9a1)    | 本番環境構成とセキュリティ設計（Apache+Tomcat+Struts2連携）                             | 外部公開           |

---