Servlet、Filter、Listener、Interceptor 四大組件區別與聯系深度解析
一、 概念辨析
| 組件 | 定義 | 配置文件 |
| Servlet | 服務端 Java 程序,處理請求響應,獨立於平台協議 | web.xml |
| Filter | 可復用代碼片段,轉換請求/響應/頭信息,不產生響應 | web.xml |
| Listener | 監聽域對象生命周期/屬性變更事件,自動觸發回調 | web.xml |
| Interceptor | AOP 實現,攔截 Service/Action 方法前後/異常 | struts.xml / spring.xml |
二、 加載順序
context-param → Listener → Filter → Servlet
三、 職責對比
- Servlet:生成完整 HTML、HTML 片段、讀取請求數據、調用業務組件、設置響應頭/狀態碼。
- Filter:請求預處理、修改請求/響應對象、攔截後處理、實現處理鏈(
chain.doFilter())。
- Listener:8 大接口分三類(Context/Session/Request),用於啟動初始化、在線統計、請求級資源清理等。
- Interceptor:基於動態代理/反射,針對方法級橫切邏輯(事務、日誌、權限),可訪問 ActionContext/ValueStack。
四、 核心區別
- 流程控制權:Filter 可決定是否繼續傳遞(
chain.doFilter()),Servlet 處理完即結束;Listener 完全事件驅動,不參與請求流程。
- 映射匹配:Servlet 採用精確路徑 > 最長路徑 > 擴展名優先級,最終只匹配一個;Filter 可匹配多個形成鏈;Interceptor 針對 Action 名稱/方法。
- 依賴容器:Filter/Listener 依賴 Servlet 容器;Interceptor(Struts2/Spring)不依賴容器,框架自行管理。
- 訪問上下文:Interceptor 可訪問 ValueStack、Action 上下文;Filter 僅能操作 ServletRequest/Response。
- 調用次數:Interceptor 在 Action 生命周期內可多次調用(攔截器棧);Filter 僅在容器初始化/每次請求調用一次。
五、 Struts2 中 Filter 與 Interceptor 關系
- Struts2 核心入口是
StrutsPrepareAndExecuteFilter(Filter),負責啟動框架、清理 ThreadLocal。
- Interceptor 棧在 Filter 內部通過
ActionInvocation 執行,屬於框架級攔截。
- 可視為:Filter 是容器級大門,Interceptor 是框架級細粒度攔截器。
六、 選型建議
- 編碼轉換、XSS 過濾、靜態資源放行 → Filter
- 應用啟動加載配置、Session 監控 → Listener
- 業務權限檢查、事務邊界、方法級日誌 → Interceptor
- 核心業務流程控制 → Servlet/Controller