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

Struts2 過濾器與攔截器差異深度解析

     編輯:Java 相關知識

本質區別

維度過濾器攔截器
實現機制函數回調Java 反射
依賴容器依賴 Servlet 容器不依賴 Servlet 容器
作用範圍幾乎所有請求僅 Action 請求
訪問上下文不可訪問 ActionContext/ValueStack可訪問 Action 上下文、值棧對象
生命周期容器啟動初始化一次Action 生命周期中可多次調用

應用場景對比

過濾器典型用途

  • 統一字符集編碼設置(CharacterEncodingFilter)。
  • URL 權限攔截(未登錄用戶重定向登錄頁)。
  • 請求參數預處理(XSS 過濾、SQL 注入關鍵字過濾)。
  • 響應頭設置(CORS、緩存控制)。

攔截器典型用途

  • 業務邏輯橫切關注點:日誌記錄、事務管理、權限校驗(基於 Action 屬性)。
  • 參數準備/轉換:ParamsInterceptor、ConversionErrorInterceptor。
  • 驗證框架集成:ValidationInterceptor。
  • 文件上傳處理:FileUploadInterceptor。
  • 結果處理:WorkflowInterceptor 控制輸入驗證失敗後的結果導向。

代碼層面對比

Filter 實現

public class EncodingFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
            throws IOException, ServletException {
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }
}

web.xml 配置:<filter>...<url-pattern>/*</url-pattern>

Interceptor 實現

public class LogInterceptor extends AbstractInterceptor {
    public String intercept(ActionInvocation invocation) throws Exception {
        String actionName = invocation.getAction().getClass().getSimpleName();
        long start = System.currentTimeMillis();
        String result = invocation.invoke(); // 執行下一個攔截器或 Action
        long end = System.currentTimeMillis();
        log.info("Action: {} 耗時: {}ms", actionName, end - start);
        return result;
    }
}

struts.xml 配置:<interceptor-ref name="logInterceptor"/> 或在 <interceptor-stack> 中組合。

AOP 視角理解

攔截器本質是 Struts2 實現的 基於方法級的 AOP:

  • invocation.invoke() 前 = @Before
  • invocation.invoke() 後 = @AfterReturning
  • 異常拋出 = @AfterThrowing
  • 環繞通知 = 手動控制 invoke() 調用時機

這使得攔截器能精細控制 Action 執行流程,甚至阻止 Action 執行(直接返回結果代碼)。

總結

  • 過濾器 是 Servlet 規範標準,屬於容器級基礎設施,粒度粗、功能通用。
  • 攔截器 是 Struts2 框架內部機制,屬於應用級 AOP 實現,粒度細、強耦合 Action 上下文,業務表達力強。
  • 實際項目中:通用横切關注點(編碼、安全過濾)用 Filter;業務相關橫切關注點(日誌、事務、驗證、文件上傳)用 Interceptor。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved