專利名稱:一種面向切面編程的攔截器系統及方法
技術領域:
本發明涉及計算機系統開發領域,特別是涉及計算機J2EE企業級應用系 統開發領域,具體是涉及一種在Stmts下的面向切面編程(AOP)的攔截器系 統及方法。
背景技術:
J2EE, Java2平臺企業版(Java 2 Platform Enterprise Edition),是Sun公司為企業級應用推出的標準軟件系統開發平臺。而隨著Java技術的發展,J2EE 平臺得到了迅速的發展,成為Java語言中最活躍的體系之一。現如今,J2EE 不僅僅是指一種標準平臺(Platform),她更多的表達著一種軟件系統架構和軟 件系統編程方法。J2EE企業級Web應用開發系統框架有Struts、 Webwork、 JSF、 Tapestry等開發框架。其中,Stmts系統框架是開放源代碼的企業級Web應用開發系統框架,目 的是從整體上減輕構造企業Web應用的負擔。而J2EE的表示層一般是用Struts 組件系統框架來編寫,其是目前最常用的企業級Web應用開發系統框架。Struts系統框架是基于Model 2設計模式的J2EE應用開發平臺。Model 2 體系是MVC (Model-View-Controller)體系中的一種。在MVC體系中,數據 模型(Model)、表現邏輯(View)和控制邏輯(Controller)是分離的組件, 但它們可以互相通信,Struts系統框架正是定位在基于Model 2設計模式的 J2EE應用開發系統框架。但是,相比于其它J2EE企業級Web應用開發系統框架,如Webwork等, Struts系統框架在默認的情況下并沒有實現面向切面的編程(AOP)。面向切面編程(Aspect Oriented Programming, AOP)主要實現的目的是 針對業務處理過程中的切面進行提取,其面對處理過程中的某個步驟階段,以 獲得邏輯過程中各部分之間低耦合性的隔離效果。例如最常見的日志記錄,現在需要提供一個查詢學生信息服務,并記錄有誰進行了這個查詢。如果按照傳 統的編程方式實現的話,那首先實現了一個査詢學生信息的服務接口(StudentlnfoService.java)禾Q其實現類(StudentlnfoServicelmpl.java),然后 為了進行記錄,在實現類(StudentlnfoServicelmpLjava)中添加實現記錄的過 程。這樣的話,如果要實現的服務有多個,則要在每個實現的類都添加這些記 錄過程。這種實現方式很繁瑣,而且每個實現類都與記錄服務日志的行為緊耦 合,違反了面向對象的規則。而為了實現日志記錄服務與業務處理過程分離, 使査詢學生信息的服務正常進行,則人們將日志記錄行為單獨進行記錄,其他 業務處理如査詢學生信息的服務不知道存在這些日志記錄過程,這就是面向切 面的編程(AOP)。面向切面的編程,就是把某個方面的功能提出來與一批對 象進行隔離,這樣與一批對象之間降低了耦合性,可以就某個功能進行編程。面向切面編程(AOP)可以使用一個代理類(Proxy),通過攔截一個對 象的行為并添加需要的功能來完成,即攔截方法,也就是面向切面編程的攔截 方法,也叫攔截器。Struts系統框架在默認情況下沒有實現面向切面編程(AOP)實現,這和 WebWork等開發框架相比存在缺陷。因此,現有的技術中,通過Lars Hoss 和Don Brown編寫SAIF (Struts Action Invocation Framework),能夠在Struts 系統框架上實現面向切面編程(AOP)。但是,SAIF實現的功能很少,其一般只能實現Struts系統框架上的最基 本的類的攔截,即只能針對一個類(如Action類)或多個類進行攔截,不能 實現對各個類里面的實現方法進行攔截(即方法級攔截器),其實用性比較差。發明內容本發明的目的在于提供一種面向切面編程的攔截器系統及方法,其全面在 Struts應用開發系統框架中實現面向切面編程(AOP),實現類的攔截(類級 攔截器)和類中實現方法的攔截(方法級攔截器),具有很好的實用性。為實現本發明目的而提供的一種面向切面編程的攔截器系統,是在Struts 應用開發系統框架下實現的,包括接口模塊,攔截器配置模塊,其中接口模塊,用于設置Struts框架下的攔截器接口,基于該接口實現攔截器類;攔截器接口, 一般基于該接口實現攔截器類,在調用攔截器的時候會執行 在接口中定義的方法;攔截器配置模塊,用于配置攔截器的配置文件,將攔截器配置到相應的執 行路徑中去。所述的面向切面編程的攔截器系統,還可以包括讀取模塊和執行模塊,其中讀取模塊,在Struts啟動初始化時,讀取配置文件,解析得到配置文件中配置的攔截器,并初始化;執行模塊,用于在客戶端訪問網站時,根據路徑調用Struts Action或者DispatchAction類,獲取路徑對應的攔截器,使用相應的攔截器接口,實現在Struts框架下面向切面編程的攔截。所述的面向切面編程的攔截器系統,所述接口模塊中,還可以包括攔截器管理模塊,用于在Spring容器的配置文件配置攔截器類對應的bean,實現在Spring容器中統一管理攔截器對象。所述的面向切面編程的攔截器系統,所述讀取模塊中,還可以進一步包括Struts插件模塊,用于在struts框架下調用Struts Action類或者DispatchAction類前(一般Web應用啟動時),在Struts配置文件中加入攔截器配置模塊,在Struts配置文件中以插件的方式配置上去;所述讀取模塊在Struts啟動初始化時,由Struts插件類讀取配置文件。 為實現本發明目的還提供一種面向切面編程的攔截方法,包括下列步驟 步驟A,設置Struts框架下的攔截器接口,基于該接口實現攔截器類; 步驟B,配置攔截器的配置文件結構,并將攔截器配置到相應的執行路徑中去,實現在Struts框架下初始化時能夠讀取面向切面編程的方法級攔截器。 所述的面向切面編程的攔截方法,所述步驟B之后還可以包括下列步驟 步驟C,在Struts啟動初始化時,讀取配置文件,解析得到配置文件中配置的攔截器,并初始化;步驟D,當客戶端訪問網站時,服務器端Servlet容器根據路徑調用StrutsAction類或者DispatchAction類,獲取路徑對應的攔截器,使用相應的攔截器接口 ,實現在Struts框架下面向切面編程的攔截。 所述步驟A還包括下列步驟-在Spring容器的配置文件配置攔截器類對應的bean,實現在Spring容器 中統一管理攔截器對象。所述步驟C中讀取配置文件是由Struts插件類完成的。 所述歩驟C可以包括下列步驟步驟C1,采用Diggester工具將xml配置文件讀入,產生Java對象; 步驟C2,解析路徑的攔截配置器,將配置分別提取,并將攔截器棧替換對應的一批攔截器;步驟C3,在每個路徑的攔截配置器中加入缺省攔截器指定的攔截器; 步驟C4,在每個路徑的攔截配置器中排除被排除的缺省攔截器中指定的攔截器;步驟C5,判斷配置攔截器是否要按順序執行,若配置中攔截配置器按順 序執行的配置為真,則對每個路徑的攔截配置器中攔截器進行排序,否則直接 返回。所述歩驟D中,使用攔截器接口,實現在struts框架下面向切面編程的攔 截,可以包括下列步驟步驟D1,執行攔截器中的前攔截器接口;步驟D2,判斷返回值是否為空,如果不為空,則表示結束,攔截器得到 結果,攔截過程結束,轉到步驟D6;步驟D3,如果為空,則執行Struts Action或者DispatchAction對象類方法, 正常執行Struts程序;步驟D4,如果拋異常,在執行Struts Action或者DispatohAction對象類方 法過程中出現異常情況時,則執行攔截器中的異常處理攔截器接口,然后,攔 截過程結束,轉到步驟D6;步驟D5,否則,正常執行Struts程序后,執行攔截器中的后攔截器接口;步驟D6,將攔截或者執行結果送出。所述接口包括前攔截器接口 、后攔截器接口和/或異常處理攔截器接口 。 所述攔截器包括權限控制攔截器、數據驗證攔截器、日志記錄攔截器以及異常處理攔截器中的一種或者一種以上的組合。本發明的有益效果是本發明的面向切面編程(AOP)的攔截器系統及方法,其在Struts應用開發系統框架下實現方法級攔截,其不但支持Struts Action類,也支持Struts DispatchAction類,支持Struts l.X全系列版本。而且,本發 明還利用Spring容器來統一管理攔截器對象,通過SpringFramework (Spring 框架)提供的Spring容器統一管理攔截器,使得程序代碼功能分解清晰,更 容易被維護,并支持按指定順序執行攔截器,從而全面在Struts開發框架中實 現面向切面編程,通過Struts Action類實現類的攔截(類級攔截器),通過Struts DispatchAction類實現方法級的攔截(方法級攔截器),具有很好的實用性。
圖1為本發明面向切面編程(AOP)的攔截器系統結構示意圖; 圖2為本發明面向切面編程(AOP)的攔截方法流程圖; 圖3為讀取配置文件并初始化過程流程圖;圖4為使用攔截器接口,實現在Struts框架下面向切面編程(AOP)的攔 截的過程。
具體實施方式
為了使本發明的目的、技術方案及優點更加清楚明白,以下結合附圖及實 施例,對本發明的一種面向切面編程的攔截器系統及方法進行進一步詳細說 明。應當理解,此處所描述的具體實施例僅僅用以解釋本發明,并不用于限定 本發明。本發明的面向切面編程的攔截器系統及方法,是實現在Struts應用幵發系 統框架下11的方法級攔截器。其當客戶端訪問網站系統時,在服務器端的 Servlet容器根據路徑調用相關的Struts Action類或者DispatchAction類時,使 用本發明的攔截器系統和方法,實現工作在Struts l.x中的方法級攔截,即Struts l.X下的方法級面向切面編程(AOP)實現。為了說明本發明的Struts下的面向切面編程的攔截器及方法,首先說明 Struts體系。Struts應用開發系統框架11的目標是為Mode12 Web應用開發提供一個強 大的框架。Struts應用開發系統框架11能夠隱藏Web訪問固有的"混亂", 幫助開發者建立起清晰和明確的秩序和規則。典型的Struts應用開發系統框架 11要用到三種配置文件web.xml、 struts-config.xml以及可選的應用資源文件。web.xml是Web應用的標準配置文件,是所有J2EE web應用必需的組成 部分。應用服務器通過該配置文件把URL映射到Servlet服務器和JSP GavaServer Pages, —種動態網頁技術標準),通過該配置文件為Servlet服 務器和JSP指定啟動參數。為Stmts應用開發系統框架11提供的web.xml文 件很簡單,真正必需的只有一個主ActionServlet類控制器(Controller)定義, 以及一個確保Struts請求傳遞到ActionServlet類控制器的映射。 一般地,以 ".do"結尾的URL (Uniform Resoure Locator,統一資源定位器)都是Struts 請求,例如/login.do。 Servlet服務器利用web.xml文件中的映射,把該請求傳 遞給ActionServlet類控制器。接著,ActionServlet類控制器決定如何分配該請 求。而ActionServlet類控制器的決定依據是Struts-config.xml中定義的方法邏 輯,和/或是通過ActionServlet派生類額外定義的分配邏輯。Struts-config.xml稱為Struts配置文件。Struts應用開發系統框架11是一 個依靠struts-config.xml文件把組件連接起來的系統。struts-config.xml文件為 Web應用的組件定義了邏輯名稱,也定義了它們在Struts框架下的屬性和關系, 就像web.xml文件在Web應用框架之內定義組件 一 樣。 一般地, struts-config.xml文件包含了與Struts框架有關的應用信息,包括數據源信息、 Form Bean信息、Global Forwards f言息禾口 Actions信息。其中,Action信息定 義了 Struts應用體系的請求分配信息,它們是核心分配器的補充定義,負責處 理各種具體的請求類型。Struts應用的基本工作模式是主分發器ActionServlet類控制器調用一個 動作分配器,動作分配器確定或者構造出Model部分(一個JavaBean或其他 Java對象),并把它提供給View (通常是一個JSP頁面)。如圖1所示,本發明的面向切面編程的攔截器系統,是在Struts應用開發 系統框架ll下,包括接口模塊21,攔截器配置模塊22,讀取模塊23和執行 模塊24,其中接口模塊21,設置struts框架下運行的接口,基于該接口實現攔截器類, 即利用該接口實現攔截器類。通過在struts框架下定義可被讀取的前攔截器接口 (beforeAction)、后攔 截器接口 (afterAction)以及異常處理攔截器接口 (throwsAction)。利用該接 口實現在struts框架下的接口攔截器類。攔截器配置模塊22,用于通過接口模塊21配置攔截器的配置文件,并將 攔截器配置到相應的執行路徑中去。所述的攔截器,可以分為權限控制攔截器32、數據驗證攔截器33、曰志 記錄攔截器34、異常處理攔截器35等。權限控制攔截器32,用于判斷用戶是否有訪問對應路徑的權限,若有權 限則返回空值(null);若沒有則返回到錯誤頁面。其一般通過運行前攔截器 (beforeAction)接口實現。數據驗證攔截器33,用于檢査客戶端提交的數據是否符合服務器所要求 的規則,若符合則返回空值(mill),若不符合則返回到錯誤頁面。其一般通 過運行前攔截器(beforeAction)接口實現。曰志記錄攔截器34,用于截獲方法調用參數、返回值、調用所花時間等 信息,然后打印日志到文件或者控制臺,最后返回空值(null)。其一般通過 運行后攔截器(afterAction)接口實現。異常處理攔截器35,用于根據傳入的參數Exceptio-e的類型分別進行處 理,然后分別返回到相應的錯誤頁面。其一般通過異常處理攔截器 (throwsAction)接口實現。讀取模塊23,在Stmts啟動初始化時,由Struts插件類讀取配置文件 struts-interceptor.xml,解析得到配置文件中配置的攔截器,并初始化。執行模塊24,用于在客戶端訪問網站時,根據路徑調用相關的Struts Action 或者DispatchAction類,獲取路徑對應的攔截器,使用攔截器,實現在Struts 框架下面向切面編程(AOP)的攔截。較佳地,本發明的面向切面編程的攔截器系統,在接口模塊21中,還包 括攔截器管理模塊31,用于在Spring容器的配置文件配置攔截器類對應的 bean,實現在Spring容器中統一管理攔截器對象。更佳地,所述面向切面編程的攔截器系統,在讀取模塊23中,還包括Struts 插件模塊,用于在struts框架下調用Struts Action類或者DispatchAction類前, 在Struts配置文件中加入攔截器配置模塊22,作為Struts配置文件插件,使得 在struts框架下調用Struts Action類或者DispatchAction類前,將攔截器配置 文件配置到相應的路徑中并駐留在系統中,不再每執行一次攔截器必須首先執 行攔截器模塊。ii特別需要說明的是,當用讀取模塊23中的Struts插件模塊將攔截器模塊 作為作為Struts配置文件插件時,則在通過接口模塊21配置struts框架下調用 Struts Action類或者DispatchAction類中的每個方法時不再調用攔截器配置模 塊22,將攔截器配置文件中的攔截器配置到相應的執行路徑中去。本發明的面向切面編程的攔截器系統,首先設置在struts框架下運行的攔 截器接口;再基于此接口實現攔截器類;然后利用在接口模塊21中的攔截器 管理模塊31在Spring容器的配置文件配置攔截器類對應的bean,實現在Spring 容器中統一管理攔截器對象;接著,按照攔截器配置文件的結構,在配置文件 中將攔截器配置到相應的執行路徑中去。其后,讀取模塊23在Struts啟動初始化時,由Struts插件類讀取配置文 件struts-interceptor.xml,解析得到配置文件中配置的攔截器,并初始化。最后,執行模塊24在客戶端訪問網站時,服務器端Servlet容器根據路徑 調用相關的Struts Action或者DispatchAction類,使用攔截器,實現在Struts 框架下面向切面編程(AOP)的攔截。如圖2所示,下面詳細描述本發明的Struts應用開發系統框架下11基于 切面編程的攔截方法步驟S100,設置在struts框架下運行的攔截器接口,基于該接口實現攔截 器類,即利用該接口實現在struts框架下的接口攔截器類;一般來說調用對象的方法時有3個處理過程,第一步是開始調用,第二步 是值返回,另外如果有異常拋出對應的就有異常處理過程,對應就有了前攔截 方法、后攔截方法和異常處理攔截方法。因此,首先設置在struts框架下可被讀取的前攔截器接口 (beforeAction)、 后攔截器接口 (afterAction)以及異常處理攔截器接口 (throwsAction)。接口 中的參數對應于Struts Action中的execute()方法中的參數。攔截器接口代碼實現如下public interface Actionlnterceptor { /***前攔截器接口* @param action被攔截器攔截的Action實例* @param mapping訪問路徑對應的ActionMapping對象* @param form路徑對應的表單,如果沒有對應的表單則為null* @param request客戶端瀏覽器傳送過來的對象* @param response送回給客戶端瀏覽器的對象* @return對應在Struts中的返回路徑 */public ActionForward beforeAction (Action action, ActionMapping mapping ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception;/***后攔截接口* @param action被攔截器攔截的Action實例* @param mapping訪問路徑對應的ActionMapping對象 *@paramform路徑對應的表單,如果沒有對應的表單則為null* @param request客戶端瀏覽器傳送過來的對象* @param response送回給客戶端瀏覽器的對象* @return對應在Stmts中的返回路徑 */public ActionForward afterAction(Action action, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception;/***異常處理攔截器接口* @param action被攔截器攔截的Action實例* @param mapping訪問路徑對應的ActionMapping對象* @param form路徑對應的表單,如果沒有對應的表單則為null* @param request客戶端瀏覽器傳送過來的對象* @param response送回給客戶端瀏覽器的對象 *@parame拋出的異常* @retum對應在Struts中的返回路徑 */public ActionForward throwsAction(Action action, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception;然后,利用該接口實現在struts框架下的接口攔截器類。 攔截器一般都使用代理來實現,本發明也使用代理類實現,其類名為 InterceptorActionProxy 。 是基于 Springframework ( Spring 框架)的 org.springframework.web.struts.DelegatingActionProxy 實現,Springframework 的org.springframework.web.struts.DelegatingActionProxy類提供了使用Sping容 器管理Struts Action的功能,InterceptorActionProxy類在其基礎上增加了根據配置文件去查找并執行相關的攔截器的功能。Struts Action或者DispatchAction的^f戈理類InterceptorActionProxy類的^(乍 用是當用戶訪問網站某一路徑時,Stmts在調用路徑對應的Action類或者 DispatchAction類時,實際上先調用的是此類,調用時執行其中的execute方法, 在這個方法中,調用攔截器配置文件讀取類獲取路徑對應的攔截器,執行攔截 器類中的相關方法并調用運行真實的Struts Action或者DispatchAction,并根據兩者調用的結果返回。InterceptorActionProxy類的主要實現代碼如下public class InterceptorActionProxy extends DelegatingActionProxy {* Pass the execute call on to the Spring-managed delegate Action.*@S66org.springframework.web.struts.DelegatingActionProxy#getDelegateAction*/public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {〃獲取訪問路徑前綴即模塊名String module = mapping.getModuleConfig().getPrefix();//若模塊為空值,則為默認模塊 if (module == null) { module -"";〃根據模塊獲取對應的Spring容器引用WebApplicationContext wac = getWebApplicationContext(getServlet(), mapping.getModuleConfig()); 〃獲取代理目標類Action delegateAction = getDelegateAction(mapping);ActionForward forward = null;Actionlnterceptor[JnterceptorArray = null;try{〃調用配置文件讀取類,査找此映射相關的攔截器interceptorArray 二 InterceptorConfig.getlnterceptorArray(module, request, wac); } catch (Exception e) {〃獲取攔截器數量int size = interceptorArray.length; if (size > 0) {for (int i = 0; i < size; i++) { try{〃執行所有攔截器中的前攔截方法,如果設置了順序則要按順序執行forward = interceptorArray[i.beforeAction(delegateAction,mapping, form, request, response); if (forward != null) {return forward; 〃如果返回值不為空,則不再執行后面的代碼直接返回} catch (Exception e) {〃如果執行過程中出現了異常,并且是ModuleExc印tion,則拋出異常 if (e instanceof ModuleException) { throw e;continue; 〃若拋出的不是ModuleExc印tion,則忽略try{〃執行Struts Action中的相關方法forward = delegateAction.execute(mapping, form, request, response); } catch (Exception e) {〃如果不是ModuleExc印tion類型則進行處理 if (e instanceof ModuleException) {throw e; } else {for (int i = 0; i < size; i++) { 〃執行所有欄截器中的異常處理攔截方法,如果設置了順序則要按順序執行forward 二 interceptorArray卩j.throwsAction(delegateAction, mapping, form, request, response, e);if (forward != null) {return forward; //如果返回值不為空,則不再執行后面的代碼直接返回//將未處理的異常拋出,交給容器處理,用于調試 throw e;ActionForward afterForward = null; for (int i = 0; i < size; i++) { try{〃執行所有攔截器中的后攔截方法,如果設置了順序則要按順序執行 afterForward = interceptorArray[i].afterAction(delegateAction, mapping, form, request, response); if (afterForward != null) {return afterForward; 〃如果返回值不為空,則不再執行后面的代碼直接返回} catch (Exception e) {if (e instanceof ModuleException) {throw e;//如果執行過程中出現了異常,并且是 ModuleException,則拋出異常continue; 〃若拋出的不是ModuleExc印tion,則忽略} else {forward = delegateAction.execute(mapping, form, request, response); 〃如果攔截器數量為0,則直接執行對應的Actionreturn forward;更進一歩地,在Spring容器的配置文件配置攔截器類對應的bean,實現 在Spring容器中統一管理攔截器對象。Springframework (Spring框架)的核心是IoC (Inversion of Control,控帝ij 反轉)禾Q AOP。IoC是一種設計模式。IoC模式進一步降低了類之間的耦合度,并且改變 了傳統的對象的創建方法,實現了一種配置式的對象管理方式,Spring框架中 由IoC容器負責配置性的對象的管理。IoC模式極大的提高了系統開發與維護 的靈活性。通過Spring配置文件可以將Struts Action和攔截器配置在Spring配置文 件中,這樣SpringFramework就會自動的創建這些對象并設置相關的依賴。 Spring配置樣例如下<!—配置一個名為setUserAdminFlaglnterc印tor的攔截器--><bean id="setUserAdminFlaglnterceptor" class="com.bupticet.locai,user_admin.web.interceptor.SetUserAdminFlaglnterceptor" /> <!一配置一個名為deleteUploadFileAllowSelfAndAdminlnterc印tor的攔截器,其 依賴userAdminManager對象一><bean id="deleteUploadFileAllowSelfAndAdminlnterceptor" class="com.bupticet.local.user—admin.web.interceptor.DeleteUploadFileAllowSelfAndAd minlnterceptor"><property name="userAdminManager"><ref local=''userAdminManager" /> </property> </b63n>較佳地,所述代理類是基于 Spring Framework 中 org.springframework.web.struts.DelegatingActionProxy的類。步驟S200,配置攔截器的配置文件結構struts-interceptor.xml,并將攔截 器配置文件中的攔截器配置到相應的執行路徑中去,實現在Struts框架下初始 化時能夠讀取面向切面編程的方法級攔截器;在Struts應用開發系統框架下11,該攔截器能夠被Stmts框架中的配置文 件struts-config.xml在啟動初始化時讀取。攔截器配置文件結構包括四個部分★第一個部分是config段,用來對攔截器系統進行功能性的配置;★第二部分是default-interceptors段,用來配置此模塊中默認要使用的攔 截器;★第三部分是interceptor-stacks段,將一批攔截器配置中攔截器棧,以方便成批配置攔截器時使用; ★第四部分則是action-interceptors段,用來對指定路徑和方法的Action進行攔截器配置, 一次可以配置一個攔截器,也可以配置攔截器棧,另外也可以配置排除默認的攔截器。 以下是使用Diggester讀取攔截器配置文件的主要代碼 /***添力卩Digester Rules* @p3ram d Vprivate static void addDigesterRules(Digester d) {〃i賣取stmts-interceptor/config/order-interceptor配置段 d.addObjectCreate("stmts-interceptor/config/order-interceptor",Orderlnterc印torModel.class); 〃創建配置段對應的對象(下同) d.addSetPraperties("stnjts-interceptor/config/order-interceptor"); 〃在對象中 將XML中的屬性對應的設置進去(下同)d.addSetNext("struts-interceptor/config/order-interceptor","setOrderlnterc印tor);〃設置加入下一個對象時執行的方法(下同) 〃讀取stmts-interceptor/default-interceptors/default-interceptor配置段 d.addObjectCreate("struts-interceptor/default-interceptors/default-interceptor",DefaultlnterceptorModel.class);d.addSetProperties("stmts-interceptor/default-interceptors/default-interceptor"); d.addSetNext("struts-interceptor/default-interceptors/default-interceptor", "addDefaultlnterceptor");\〃 i賣取struts-interceptor/interceptor-stacks/interceptor-stack配置段 d.addObjectCreate("struts-interceptor/interceptor-stacks/interceptor-stack",InterceptorStackModel.class);d.addSetProperties("struts-interceptor/interceptor-stacks/interceptor-stack"); d.addSetNext("struts-interceptor/interceptor-stacks/interceptor-stack", "addlnterceptorStackModel"); 〃 i賣取struts-interceptor/interceptor-stacks/interceptor-stack/interceptor陽ref配置段 d.addObjectCreate( "struts-interceptor/interceptor-stacks/interceptor-stack/interceptor-ref', I nterceptorRef Model class);d.addSetProperties("struts-interceptoi7interceptor陽stacks/interceptor-stack/interce ptor-ref);d.addSetNext("struts-interceptor/interceptor-stacks/interceptor-stack/interceptor-rer,"addlnterceptorRef'); 〃 i賣取struts-interceptor/action-interceptors/action配置段 d.addObjectCreate("struts-interceptor/action-interceptors/action"'ActionModel.class); d.addSetProperties("struts-interceptor/action-interceptors/action"); d.addSetNext("struts-interceptor/action-interceptors/action", "addAction");〃i賣取struts-interceptor/action-interceptors/action/exclude-default配置段 d.addObjectCreate("stmts-interceptor/action-interceptors/action/exclude-default",\ExcludeDefaultModel.class);d.addSetProperties("struts-interceptor/action-interceptors/action/exclude-default"); d.addSetNext("struts-interceptor/action-interceptors/action/exclude-default", "setExcludeDefault"); 〃i賣取struts-interceptor/action-interceptors/action/exclude-default/exclude酉己—1!段 d.addObjectCreate( "struts-interceptor/action-jnterceptors/action/exclude-default/exclude", ExcludeModel.class);d.addSetProperties("stmts-interceptoi7action-interceptors/action/exclude-default/e xclude");d.addSetNext("struts-interceptor/action-interceptors/action/exclude-default/exclude", "addExdude");〃i賣取stmts-interceptor/action-interceptors/action/method配置段 d.addObjectCreate("struts-interceptor/action-interceptors/action/method", MethodModel.class);d.addSetProperties("struts-interceptor/actJon-interceptors/action/method"); d.addSetNext("stmts-interceptor/action-interceptors/action/method", "addMothod");〃i賣取struts-interceptor/action-interceptors/action/method/exclude-default配置段 d.addObjectCreate(d9。J9)u!/po£SE/uo!pe/SJOJd90J9}u!-uo!pe/」OJd90J9JU!,s}nJls--)s9!t9do」n-lssppB.--Jai-」o}dso」91u!/po£9E/uo!pe/SJOJd8J91u!-uo!pe/」£da。J91u!-ss4s=趙鵬2li9」-JOJd90Jalu!/POL-19E/uo一loe/SJold90J91u!-uo!VDe/」old90JQlu!-SSJls趙踏//- 9pnlox9ZJIn_3J9p-spnlox9/po£9E/uo!pe/SJ2d9a-91u!-uo!pe/」old90」^u!-sln.4s---apnlox9/po£9E/uo!pe/s」old9。J91u!-uo!pe/」old9。」slu!-SSJls--)s9!lJ3do」d^sppB.\,9pnpx9/llneJ.9p-9pnlox9/po£9E/uo!pe/SJold90」91u!-uo!peyJold90」su!-SSJls ¥a-opsfqoppe-P3g9pnlox9/Jlnei9p-9pnl。x9/poq一9E/uo一pe/s」cnd90J9JU一-uo!pe/」oidso.5JU!-ss.us磁脈一//-』J9p-9pnlox9/POL-lsE、uo!pe/SJOidao」9}u!-uo!pe/」oldao」91u!-SSJls--)PSN冗sppe-P一(』nei①p-spnlcos/po£9E、uo!pe/SJO》d90JanJ!-uo!pe/Jold90」91u!-ss4s,,)s9!t9doJd}3sppm.\;lneisp-9pnlox9、po£9£/uo!pe/s」£d90J >u!-uo!pe/」old9。」9iu!-ss.4s,-d.addSetNext("struts-interceptor/action-interceptors/action/method/interceptor-ref', "addlnterceptorRef'); 〃i賣取struts-interceptor/action-interceptors/action/method/stack-ref配置段 d.addObjectCreate("struts-interceptor/action-interceptors/action/method/stack-ref', StackRefModel.class);d.addSetProperties("struts-interceptor/action-interceptors/action/method/stack-rer); d.addSetNext("struts-interceptor/action-interceptors/action/method/stack-ref , "addStackRef');其中,Diggester是一個XML解析工具,它將XML直接讀取成Java對象。所述的攔截器,可以分為權限控制攔截器32、數據驗證攔截器33、曰志 記錄攔截器34、異常處理攔截器35等。權限控制攔截器32,用于判斷用戶是否有訪問對應路徑的權限,若有權 限則返回空值(null);若沒有則返回到錯誤頁面。其一般通過前攔截器接口 (beforeAction)實現。數據驗證攔截器33,用于檢查客戶端提交的數據是否符合服務器所要求 的規則,若符合則返回空值(null),若不符合則返回到錯誤頁面。其一般通 過前攔截器接口 (beforeAction)實現。日志記錄攔截器34,用于截獲方法調用參數、返回值、調用所花時間等 信息,然后打印日志到文件或者控制臺,最后返回空值(null)。其一般通過 后攔截器接口 (afterAction)實現。異常處理攔截器35,用于根據傳入的參數Exception-e的類型分別進行處 理,然后分別返回到相應的錯誤頁面。其一般通過異常處理攔截器接口 (throwsAction)實現。步驟S300,在Struts啟動初始化時,由Struts插件類讀取配置文件 struts-interceptor.xml,解析得到配置文件中配置的攔截器,并初始化;Java的Web應用程序(Java web application)啟動時,由Struts插件類 com.bupticet. strutsinterceptor. StrutsInterceptorContextLoaderPlugln裝載牛蘭截器 配置文件,要求在Spring容器裝載之后,再裝置Struts應用程序,如圖3所示, 其過程如下步驟S301 ,采用Diggester工具將xml配置文件讀入,產生Java對象(Java object);步驟S302,解析路徑的攔截配置器action-interceptors段,將配置分別提 取,并將攔截器棧stack-ref替換對應的一批攔截器interceptor;步驟S303,在每個路徑的攔截配置器action-interceptor中加入缺省攔截器 default-interceptors段指定的攔截器interceptor;步驟S304,在每個路徑的攔截配置器action-interceptor中排除被排除的缺 省攔截器exdude-default配置段中指定的攔截器interceptor;步驟S305,判斷配置攔截器是否要按順序執行,若配置器config段中路 徑的攔截配置器order-interceptor的配置為真(true),則對每個路徑的攔截配 置器action-interceptor中攔截器interceptor進行排序,否則直接返回。步驟S400,當客戶端訪問網站時,服務器端Servlet容器根據路徑調用相 關的Struts Action或者DispatchAction類,獲取路徑對應的攔截器,使用相應 的攔截器接口,實現在Struts框架下面向切面編程(AOP)的攔截。Struts DispatchAction禾卩Struts Action比較類似,不同之處在于 DispatchAction中可以有多個映射到訪問路徑的方法,而Action只能有一個 6xecute oDispatchAction繼承自Action類,它是一個抽象類,封裝了一些基礎方法, 來解決使用一個Action處理多個操作的能力,這就是DispatchAction最大的用途,它可以幫助我們用一個Action類,封裝一套類似的操作方法,節省了 類的數目,同時也減輕了后期維護的困難。本發明在配置文件中對每個Action的配置時,都有個method屬性,若這 個屬性為execute則就可以對Struts Action進行類級別的攔截;若這個屬性是 其它值,則就可以對Struts DispatchAction類中以這個屬性名命名的方法進行 方法級別的攔截,從而實現方法級的攔截。如圖4所示,下面詳細描述使用攔截器接口 ,實現在Struts框架下面向切 面編程(AOP)的攔截的過程歩驟S401,執行攔截器中的前攔截器接口 (Before-Action);歩驟S402,判斷返回值是否為空,如果不為空,則表示結束,攔截器得 到結果,攔截過程結束,轉到步驟S406;歩驟S403 ,如果為空,則執行Struts Action或者DispatchAction對象類方 法,正常執行Struts程序;步驟S404,如果拋異常,即在執行Struts Action或者DispatchAction對象 類方法過程中出現異常情況時,如網絡連接錯誤,讀寫磁盤文件錯誤等,則執 行攔截器中的異常處理攔截器(ThrowAction)接口,然后,攔截過程結束, 轉到步驟S406;步驟S405,否則,正常執行Struts程序后,執行攔截器中的后攔截器接 口 (AfterAction);步驟S406,將攔截或者執行結果(Response)送出。用類似Java的代碼表示其執行過程為try{interceptor.beforeAction(); strutsAction.invoke(); interceptor.afterAction(); }catch(Exception e){interceptor .throwAction();通過以上結合附圖對本發明具體實施例的描述,本發明的其它方面及特征 對本領域的技術人員而言是顯而易見的。本發明的面向切面編程(AOP)的攔截器及方法,其在Struts應用開發系 統框架下11實現方法級攔截,當客戶端訪問網站系統時,服務器端Servlet容 器根據路徑調用相關的Struts Action或DispatchAction時,使用本發明的攔截 方法配置攔截器,例如權限控制攔截器、數據驗證攔截器、日志記錄攔截器、 異常處理攔截器,并用SpringFmmework提供的容器來統一管理這些攔截器對 象,使得程序代碼功能分解清晰,更容易被維護。其不但支持Struts Action類, 也支持Struts DispatchAction類,支持Stmts l.X全系列版本甚至更高的版本。 而且,本發明做到用Spring容器來統一管理攔截器對象,支持按指定順序執 行攔截器,從而全面在Struts開發框架中實現面向切面編程,實現類的攔截(類 級攔截器)和各個類中的實現方法而進行攔截(方法級攔截器),具有很好的 實用性。以上對本發明的具體實施例進行了描述和說明,這些實施例應被認為其只 是示例性的,并不用于對本發明進行限制,本發明應根據所附的權利要求進行 解釋。
權利要求
1. 一種面向切面編程的攔截器系統,是在Struts應用開發系統框架下實現的,其特征在于,包括接口模塊,攔截器配置模塊,其中接口模塊,用于設置Struts框架下的攔截器接口,基于該接口實現攔截器類;攔截器配置模塊,用于通過接口模塊配置攔截器的配置文件,并將攔截器配置到相應的執行路徑中去。
2、 根據權利要求1所述的面向切面編程的攔截器系統,其特征在于,還 包括讀取模塊和執行模塊,其中讀取模塊,在Struts啟動初始化時,讀取配置文件,解析得到配置文件中 配置的攔截器,并初始化;執行模塊,用于在客戶端訪問網站時,根據路徑調用Struts Action或者 DispatchActkm類,獲取路徑對應的攔截器,使用相應的攔截器接口,實現在 Struts框架下面向切面編程的攔截。
3、 根據權利要求1或2所述的面向切面編程的攔截器系統,其特征在于, 所述接口模塊中,還包括攔截器管理模塊,用于在Spring容器的配置文件配 置攔截器類對應的bean,實現在Spring容器中統一管理攔截器對象。
4、 根據權利要求2所述的面向切面編程的攔截器系統,其特征在于,所 述讀取模塊中,還進一步包括Struts插件模塊,用于在struts框架下調用Struts Action類或者DispatchAction類前,在Struts配置文件中加入攔截器配置模塊, 作為Struts配置文件插件;所述讀取模塊在Struts啟動初始化時,由Struts插件類讀取配置文件。
5、 根據權利要求1或2所述的面向切面編程的攔截器系統,其特征在于, 所述接口包括前攔截器接口 、后攔截器接口和/或異常處理攔截器接口 。
6、 根據權利要求1或2所述的面向切面編程的攔截器系統,其特征在于, 所述攔截器包括權限控制攔截器、數據驗證攔截器、日志記錄攔截器以及異常 處理攔截器中的一種或者一種以上的組合。
7、 一種面向切面編程的攔截方法,其特征在于,包括下列步驟 步驟A,設置Struts框架下的攔截器接口,基于該接口實現攔截器類;;步驟B,配置攔截器的配置文件結構,并將攔截器配置到相應的執行路徑 中去,實現在Struts框架下初始化時能夠讀取面向切面編程的方法級攔截器。
8、 根據權利要求7所述的面向切面編程的攔截方法,其特征在于,所述步驟B之后還包括下列步驟步驟C,在Struts啟動初始化時,讀取配置文件,解析得到配置文件中配 置的攔截器,并初始化;步驟D,當客戶端訪問網站時,服務器端Servlet容器根據路徑調用Struts Action類或者DispatchAction類,獲取路徑對應的攔截器,使用相應的攔截器 接口,實現在Stmts框架下面向切面編程的攔截。
9、 根據權利要求7或8所述的面向切面編程的攔截方法,其特征在于, 所述步驟A還包括下列步驟在Spring容器的配置文件配置攔截器類對應的bean,實現在Spring容器 中統一管理攔截器對象。
10、 根據權利要求8所述的面向切面編程的攔截方法,其特征在于,所述 步驟C中讀取配置文件是由Struts插件類完成的。
11、 根據權利要求IO所述的面向切面編程的攔截方法,其特征在于,所 述步驟C包括下列步驟步驟C1,,采用Diggester工具將xml配置文件讀入,產生Java對象; 歩驟C2,解析路徑的攔截配置器,將配置分別提取,并將攔截器棧替換對應的一批攔截器;步驟C3,在每個路徑的攔截配置器中加入缺省攔截器指定的攔截器; 歩驟C4,在每個路徑的攔截配置器中排除被排除的缺省攔截器中指定的攔截器;步驟C5,判斷配置攔截器是否要按順序執行,若配置器中路徑的攔截配 置器的配置為真,則對每個路徑的攔截配置器中攔截器進行排序,否則直接返 回。
12、 根據權利要求8所述的面向切面編程的攔截方法,其特征在于,所述 步驟D中,使用攔截器接口,實現在struts框架下面向切面編程的攔截,包括 下列步驟步驟D1,執行攔截器中的前攔截器接口;步驟D2,判斷返回值是否為空,如果不為空,則表示結束,攔截器得到 結果,攔截過程結束,轉到歩驟D6;步驟D3,如果為空,則執行Struts Action或者DispatchAction對象類方法, 正常執行Struts程序;步驟D4,如果拋異常,在執行Struts Action或者DispatchAction對象類方 法過程中出現異常情況時,則執行攔截器中的異常處理攔截器接口,然后,攔 截過程結束,轉到步驟D6;歩驟D5,否則,正常執行Struts程序后,執行攔截器中的后攔截器接口;步驟D6,將攔截或者執行結果送出。
13、 根據權利要求7或8所述的面向切面編程的攔截方法,其特征在于, 所述接口包括包括前攔截器接口 、后攔截器接口和/或異常處理攔截器接口 。
14、 根據權利要求7或8所述的面向切面編程的攔截方法,其特征在于, 所述攔截器包括權限控制攔截器、數據驗證攔截器、日志記錄攔截器以及異常 處理攔截器中的一種或者一種以上的組合。
全文摘要
本發明公開了一種面向切面編程的攔截器系統及方法。其包括設置在Struts框架下運行的攔截器接口,基于該接口實現攔截器類;配置攔截器的配置文件結構,并在攔截器配置文件中將攔截器配置到相應的執行路徑中去;在Struts啟動初始化時,讀取配置文件,解析得到配置文件中配置的攔截器,并初始化;當客戶端訪問網站時,服務器端根據路徑調用Struts Action類或者DispatchAction類時獲取攔截器,執行相應的攔截器方法,實現在Struts框架下面向切面編程的攔截。其實現類的攔截和對各個類中的實現方法而進行的攔截,具有很好的實用性。
文檔編號G06F9/44GK101276271SQ20071006492
公開日2008年10月1日 申請日期2007年3月29日 優先權日2007年3月29日
發明者廖德生, 文福安, 李江濤 申請人:北京郵電大學