首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts2 攔截器完整應用教學:從基礎配置到方法攔截實戰

     編輯:Java 相關知識

什麼是 Struts2 攔截器?

Struts2 攔截器功能類似 Servlet Filter,能在 Action 執行前後攔截請求,實現權限驗證、日誌記錄、事務管理等橫切關注點。攔截器定義於 struts-default.xml,開發者可自訂攔截器並透過 struts.xml 配置套用。

核心介面與三大生命週期方法

自訂攔截器需實作 com.opensymphony.xwork2.interceptor.Interceptor 介面,實作三個方法:

  • init():攔截器初始化,僅執行一次
  • intercept(ActionInvocation invocation):核心攔截邏輯,決定是否放行或攔截
  • destroy():銷毀前清理資源

基礎配置範例:登入驗證攔截器

1. 定義攔截器類別

package com.interceptor;

public class MyInterceptor implements Interceptor {
    @Override
    public void init() { System.out.println("-----Init()-------"); }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        Map session = invocation.getInvocationContext().getSession();
        if (session.get("username") != null) {
            System.out.println("登入成功!");
            return invocation.invoke(); // 放行
        } else {
            System.out.println("登入失敗!");
            return "checkError"; // 導向登入頁
        }
    }

    @Override
    public void destroy() { System.out.println("----destroy()----"); }
}

2. struts.xml 配置攔截器與 Action

<package name="testLogin" namespace="/" extends="struts-default">
  <interceptors>
    <interceptor name="myInterceptor" class="com.interceptor.MyInterceptor"/>
  </interceptors>

  <action name="demo" class="com.action.LoginAction">
    <result name="success">/success.jsp</result>
    <result name="checkError">/checkSession.jsp</result>
    <interceptor-ref name="myInterceptor"/>
    <interceptor-ref name="defaultStack"/>
  </action>
</package>

攔截器堆疊:統一管理多個攔截器

透過 <interceptor-stack> 將常用攔截器組合,避免在每個 Action 重複引用:

<interceptor-stack name="defaultstack1">
  <interceptor-ref name="myInterceptor"/>
  <interceptor-ref name="defaultStack"/>
</interceptor-stack>

<action name="demo" class="com.action.LoginAction">
  <interceptor-ref name="defaultstack1"/>
</action>

預設攔截器堆疊與排除機制

  • default-interceptor-ref:為無指定攔截器的 Action 自動套用預設堆疊
  • defaultStack:在 Action 中引用可跳過所有攔截器(含預設堆疊)

方法級攔截:精準控制特定方法

繼承 MethodFilterInterceptor 並配合 includeMethods/excludeMethods 參數,可針對特定 Action 方法啟用/停用攔截:

<interceptor-ref name="defaultStack">
  <param name="includeMethods">Method1</param>
  <param name="excludeMethods">Method2</param>
</interceptor-ref>

內建攔截器速查表

攔截器名稱功能說明
params將請求參數注入 Action 屬性
validation依據 XML 規則驗證表單資料
workflow驗證失敗時導向 INPUT 頁面
fileUpload支援檔案上傳處理
i18n記錄用戶語系偏好
token防止表單重複提交
timer輸出 Action 執行耗時
exception統一異常頁面導向

實戰建議

  1. 優先使用內建攔截器,減少自訂開發
  2. 攔截器堆疊設計應遵循單一職責原則
  3. 方法級攔截適合針對特定業務邏輯(如匯出、列印)排除驗證
  4. 避免在攔截器中進行耗時操作,影響整體效能
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved