複製鏈接
請複製以下鏈接發送給好友

攔截器

鎖定
攔截器(Interceptor),主要完成請求參數的解析、將頁面表單參數賦給值棧中相應屬性、執行功能檢驗、程序異常調試等工作。 [1] 
中文名
攔截器
外文名
Interceptor
應    用
java [2] 
領    域
計算機與信息科學 [2] 

攔截器簡介

攔截器(Interceptor)是Struts2框架的核心功能之一,Struts 2是一個基於MVC設計模式的開源框架, [3]  主要完成請求參數的解析、將頁面表單參數賦給值棧中相應屬性、執行功能檢驗、程序異常調試等工作。Struts2攔截器是一種可插拔策略,實現了面向切面的組件開發,當需要擴展功能時,只需要提供對應攔截器,並將它配置在Struts2容器中即可,如果不需要該功能時,也只需要在配置文件取消該攔截器的設置,整個過程不需要用户添加額外的代碼。攔截器中更為重要的概念即攔截器(Interceptor Stack),攔截器棧就是Struts2中的攔截器按一定的順序組成的一個線性鏈,頁面發出請求,訪問Action對象或方法時,棧中被設置好的攔截器就會根據堆棧的原理順序的被調用。 [1] 

攔截器Struts默認攔截器

Struts默認攔截器 Struts默認攔截器
過濾器調度程序必須做的事情有很多,而沒有駐留在過濾器調度程序類內部的代碼往往會被模塊化成一系列攔截器。攔截器可以通過編輯Struts配置文件而被插入或拔出。表格列出了Struts的默認攔截器。括號裏部分是在配置文件裏註冊該攔截器時用的名字,在使用一個攔截器之前必須先在配置文件裏註冊它,例如,Alias攔截器的註冊名是alias。 [2] 

攔截器工作原理

Struts 2中將各個功能對應的攔截器分開定義, 每個攔截器完成單個功能, 如果需要對Action運用某個功能就引用對應的攔截器。在實際開發中, 經常需要在Action執行前同時執行多個攔截動作, 如:用户登錄檢查、登錄日誌記錄以及權限檢查等, 這時, 可以把多個攔截器組成一個攔截器。所謂的攔截器棧是指對應各個功能的攔截器按照一定的順序排列形成的鏈, 在使用時, 可以將棧內的多個攔截器當成一個整體來引用。當攔截器棧被附加到一個Action上時, 在執行Action之前必須先執行攔截器棧中的每一個攔截器。通常情況下, 攔截器都是以代理方式調用的。 [3] 
Struts 2攔截器在Action執行前後進行攔截, 圍繞着Action的執行而執行, 比如實現日誌管理攔截器和安全功能的攔截器, 在系統的Action關聯了攔截器, 添加到Action執行過程中以後, 系統的整個執行流程就變為:記錄日誌、執行安全檢測、執行Action、執行安全檢測、記錄日誌, 在執行的過程中, 每一個攔截器類的攔截方法決定是傳遞請求, 還是終止請求。 [3] 

攔截器權限控制攔截器

在實際的Web應用軟件項目中, 與項目的業務邏輯相關的通用功能需要開發人員自定義攔截器實現。比如Web應用軟件都要涉及到權限控制這部分, 當用户訪問系統的受保護資源時, 需要先檢查用户是否已經登錄, 以及是否有權限訪問, 可以由攔截器截獲用户請求, 判斷用户是否已經登錄。 [3] 

攔截器自定義攔截器

如果需要自定義攔截器類, 該類就需要實現Interceptor接口。這個接口提供了攔截器的生命週期方法: (1) init () 方法在攔截器被創建後調用, 對系統相關資源進行必要的初始化工作。 (2) destroy () 方法在攔截器對象被銷燬之前調用, 用來釋放和攔截器相關的資源。 (3) intercept (ActionInvocation invocation) 方法是攔截器的核心方法, 用來實現具體的攔截操作, 可以通過ActionInvocation參數的invoke () 方法, 將控制權轉給下一個攔截器或者控制器Action。如果需要自定義攔截器類, 只需要實現Interceptor接口的三個方法即可。然而在實際開發過程中, 更常用的一種方式是繼承抽象攔截器類AbstractIntercepter, 它實現了Interceptor接口, 因此可以直接繼承該抽象類, 簡化代碼的編寫。 [3] 

攔截器實現權限控制攔截器

判斷用户是否登錄, 可以跟蹤用户的會話對象session來完成, 利用ActionContext對象就可以可訪問到session中的屬性, 攔截器執行攔截的intercepte方法的invocation參數可以得到ActionContext對象, 通過ActionInvocation參數取得用户的session實例的引用, 從而判斷是否需要轉入登錄頁面。 [3] 

攔截器配置權限控制攔截器

如果要使用權限控制攔截器, 還要在項目的配置文件struts.xml中定義該攔截器。由於Struts2中很多核心功能都是由系統默認的defaultStack中的攔截器實現的, 所以開發人員自定義的攔截器需要引用系統默認的defaultStack, 這樣Web應用才可以使用Struts 2框架提供的眾多功能。 [3] 
參考資料