溫立輝

摘 要:針對程序設計過程中攔截機制的應用問題,討論了攔截機制的實現原理,闡述攔截機制的適用場景;同時重點分析Java語言中的二種實現方式,并對比二種方式各自的優缺點,最后指出了攔截機制的重要作用。
關鍵詞:攔截;過濾器;AOP代理;映射
攔截機制在各種面向對象編程語言中均有極其重要的位置,不同語言中的實現方式有所不同,即使在同一語言中也有多種實現方式。Java語言中的攔截機制可以通過過濾器、Struts框架攔截器、Spring框架AOP代理等方式去進行實現。
1 攔截機制原理分析
攔截組件是一個服務器端的構件,它可以截取客戶端的請求與響應信息,以便查閱、提取或操作客戶機和服務器之間正在交換的數據,其原理如圖1所示。首先,各種形式的客戶端向應用服務發送請求;其次,各種請求在到達真正目標服務前會被攔截組件所截獲,并交由請求攔截方法處理,處理完畢后放行,請求才能到達真正的目標;第三,目標服務業務邏輯處理完成后,向客戶端發送響應結果;第四,目標服務返回的影響結果同樣會被攔截組件所截獲,并交由響應攔截方法處理,處理完畢才真正返回到客戶端。
攔截機制主要應用于以下場景:1)日志模塊:通過攔截用戶的每一個操作,可記錄其行為特征及操作過程,以便于將來的審計、檢查、核對;2)權限模塊:通過截獲用戶的每一個請求,檢查其合法性,是否擁有所請求的數據資源或權限資源,以對請求對行權限控制;3)資源管理模塊:通過統一攔截控制進行資源初始化或釋放及相關管理工作,如用戶退出系統時進行公共攔截并釋放相關資源;4)事務模塊:在請求到達目標對象前截獲并開啟一個相關事務,在請求結束后,同樣截獲響應并提交或回滾事務,從而達到事務管理的目的。
2 Java的實現方式
Java編程語言中,攔截機制的實現方式多種多樣,在各種不同的應用框架中都有自己的一套相應機制,下面主要對二種常見的、基本的實現方式進行分析、論述。
2.1 Servlet過濾器定義
過濾器(Filter)是Java攔截中最普通的一種實現方式,是SUN公司于2000年在Servlet2.3中新增加的功能,此種攔截方式適合于所有沒有特殊要求web的應用系統中。
在Filter接口中有三個抽象方法:init方法在容器啟動時被調用,負責資源初始化;doFilter方法是請求的攔截方法,負責請求數據合法性的檢查;destroy方法在容器關閉時調用,負責資源的銷毀、釋放。自定義類需實現Filter接口,并在工程web.xml映射文件中配置好相應攔截。配置代碼如下所示:
<!--攔截器定義 -->
<!--自定義攔截類 -->
<!--攔截規則定義 -->
<!--表示攔截所有請求 -->
2.2 Strust框架自定義攔截器
攔截器是Struts2框架的核心,攔截器可以讓程序員在Action類被執行的前后嵌入相關的業務代碼。Struts2攔截器的實現相對簡單,請求到達Struts2的中央處理器FilterDispatcher時,會讀取struts.xml配置文件中的攔截器配置,然后實例化相關對象,并按一定的規則順序進行調用,此種攔截方式適合于用Struts框架構建的應用系統中。
自定義攔截類需實現Interceptor接口,接口有同樣有:init、destory、intercept三個方法。請求到達Action的前后均會被intercept截獲,通過參數ActionInvocation可取得對應的Action實例,并通過參數的實例對象中的invoke方法可以控制請求的流向。其相關配置如下代碼所示:
<!-- 攔截器的定義 -->
<!-- 自定義攔截類 -->
<!-- 攔截器在Action中的引用 -->
3 結語
攔截機制是Java語言的一個重要功能特征,其有助于提升面向橫截面編程的能力,增強系統的健壯性,同時Java語言中存在多種不同的攔截實現方式,各自適應不同的應用場景,攔截機制如果應用不當導致性能低下、效率不佳等問題,因而不能濫用。
參考文獻:
[1] 陽瑞發.基于攔截器的Web服務會話技術研究[J].制造業自動化,2015,37(20):54-55.
[2] 董慧慧.基于struts2攔截器的操作日志系統設計[J].計算機光盤軟件與應用,2012(4):141-142.
[3] 王濤濤,李曉禹,施煒利.Struts2攔截器控制頁面訪問權限的設計與實現[J].計算機與現代化,2009(1):32-33,37.