Struts2 攔截器功能類似 Servlet Filter,能在 Action 執行前後攔截請求,實現權限驗證、日誌記錄、事務管理等橫切關注點。攔截器定義於 struts-default.xml,開發者可自訂攔截器並透過 struts.xml 配置套用。
自訂攔截器需實作 com.opensymphony.xwork2.interceptor.Interceptor 介面,實作三個方法:
init():攔截器初始化,僅執行一次intercept(ActionInvocation invocation):核心攔截邏輯,決定是否放行或攔截destroy():銷毀前清理資源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()----"); }
}
<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>
繼承 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 | 統一異常頁面導向 |