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

Struts2 攔截器機制詳解:核心原理、默認攔截器棧與自定義登錄攔截實戰

     編輯:Java 綜合教學

Struts2 攔截器架構深度解析

攔截器是 Struts2 核心擴展點,實現橫切關注點(參數封裝、類型轉換、驗證、文件上傳、國際化等)的即插即用組合。

一、什麼是攔截器

攔截器在 Action 的 execute() 執行前後、Result 渲染前後插入通用邏輯,類似 Servlet Filter 但僅攔截 Action 請求,不攔截靜態資源(JSP、CSS、JS)。

二、為什麼需要攔截器

  • 早期 MVC 將通用邏輯硬編碼在核心控制器,靈活性差。
  • Struts2 將功能拆解為細粒度攔截器,按需組合,配置驅動,提升框架擴展性。

三、攔截器鏈執行原理

  1. 請求進入 ActionInvocation.invoke()。
  2. 2. 依次調用配置的攔截器 intercept(invocation)。 3. 攔截器內部調用 invocation.invoke() 將控制權傳給下一個攔截器(遞歸調用)。 4. 最後一個攔截器調用 Action.execute()。 5. 返回時按相反順序回退執行攔截器後置邏輯。 6. 任一攔截器直接返回結果字符串可終止後續執行(短路)。

本質:責任鏈模式 + 命令模式的遞歸實現。

四、默認攔截器棧

<interceptor-stack name="defaultStack">
  <interceptor-ref name="exception"/>           <!-- 異常映射 -->
  <interceptor-ref name="alias"/>             <!-- 參數別名 -->
  <interceptor-ref name="servletConfig"/>     <!-- Servlet API 注入 -->
  <interceptor-ref name="i18n"/>              <!-- 國際化 -->
  <interceptor-ref name="prepare"/>           <!-- Preparable 接口回調 -->
  <interceptor-ref name="chain"/>             <!-- Action 鏈 -->
  <interceptor-ref name="modelDriven"/>       <!-- ModelDriven 接口 -->
  <interceptor-ref name="fileUpload"/>        <!-- 文件上傳 -->
  <interceptor-ref name="params"/>            <!-- 參數綁定 -->
  <interceptor-ref name="validation">         <!-- 驗證 -->
    <param name="excludeMethods">input,back,cancel,browse</param>
  </interceptor-ref>
  <interceptor-ref name="workflow">           <!-- 驗證失敗短路 -->
    <param name="excludeMethods">input,back,cancel,browse</param>
  </interceptor-ref>
  <!-- debugging, deprecation 等 -->
</interceptor-stack>

五、自定義攔截器實戰:登錄驗證

1. 實現 Interceptor 接口

package cn.wz.logindemo;
import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.interceptor.Interceptor;
import java.util.Map;

public class MyInterceptor implements Interceptor {
    public String intercept(ActionInvocation inv) throws Exception {
        ActionContext ctx = inv.getInvocationContext();
        Map<String, Object> session = ctx.getSession();
        if (session.containsKey("userName")) {
            return inv.invoke(); // 已登錄,繼續鏈
        }
        return "input"; // 未登錄,短路返回 input 結果
    }
    public void init() {}
    public void destroy() {}
}

2. struts.xml 配置

<interceptors>
  <interceptor name="loginCheck" class="cn.wz.logindemo.MyInterceptor"/>
  <interceptor-stack name="myStack">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="loginCheck"/>
  </interceptor-stack>
</interceptors>

<default-interceptor-ref name="myStack"/>

<action name="secureAction" class="...">
  <result name="input">/login.jsp</result> <!-- 未登錄跳轉登錄頁 -->
  <result name="success">/welcome.jsp</result>
</action>

配置截圖

六、總結

攔截器是 Struts2 實現 AOP 的關鍵機制。掌握默認棧組成、執行流程與自定義開發,能精準控制請求處理管道,實現認證授權、日誌審計、事務管理等橫切需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved