您好, 訪客   登錄/注冊

Struts 2攔截器的研究與應用

來源:用戶上傳      作者:

  【摘 要】介紹了Struts 2框架攔截器的設計思想和工作原理,并以軟件系統常見的權限控制功能為例,詳細說明了攔截器在基于Java EE 平臺的Web應用系統中的設計及配置。攔截器在Web開發中的應用,提高了系統代碼的可復用性、可擴展性及靈活性。
  【關鍵詞】攔截器;過濾器;Java EE;權限控制
  中圖分類號: TP311 文獻標識碼: A 文章編號: 2095-2457(2019)11-0031-002
  【Abstract】Introduces the design idea and working principle of the Struts 2 framework interceptor,and take the software system as an example,A detailed description of the interceptor in the design and configuration of Web application system based on Java EE platform,the application of the interceptor in Web development,improve code reusability, scalability and flexibility.
  【Key words】Interceptor;Filter;Java EE;Permission control
  0 前言
  目前,在Web應用軟件開發中,經常要用到一些公共服務如用戶認證、權限檢查、日志管理、安全檢測、統計應用的訪問量、實現數據壓縮等,如果能將這些服務和軟件的主要業務邏輯模塊恰當地組合在一起,將提高代碼的可復用性、可擴展性及靈活性[1-3]。AOP(Aspect-Oriented Programming)面向切面的編程利用橫切技術將與業務無關的公共模塊同邏輯模塊分離,攔截器是AOP的一種實現策略,以動態的“可插拔”的方式解決了上述問題。文章詳細分析了攔截器的設計思想和工作原理,并以權限控制為例,詳細說明了攔截器的設計及配置,為Web開發人員靈活運用攔截器技術提供了借鑒。
  1 攔截器
  1.1 概述
  Struts 2是一個基于MVC設計模式的開源框架,它的很多核心功能都借助于攔截器實現,如封裝請求參數、數據校驗、類型轉換、文件上傳、防止表單的重復提交等。在實際項目開發中,利用Struts 2的內置攔截器就可以完成很多操作,當內置攔截器不能滿足要求時,開發人員可以自定義攔截器進行擴展。
  在訪問Struts 2控制器Action的方法之前或之后,攔截器可以進行攔截,加入某些操作,完成特定的功能[4]。攔截器同時也提供了一種可以提取Action中可重復執行部分的方式,通過把重復的代碼提取到攔截器類中,從而實現更好的代碼復用性。攔截器實現了AOP技術,并且是可插拔的,當需要為Action添加功能的時候就配置該攔截器,當為Action減少功能的時候就取消配置攔截器,具有很好的可擴展性。
  1.2 工作原理
  Struts 2中將各個功能對應的攔截器分開定義,每個攔截器完成單個功能,如果需要對Action運用某個功能就引用對應的攔截器。在實際開發中,經常需要在Action執行前同時執行多個攔截動作,如:用戶登錄檢查、登錄日志記錄以及權限檢查等,這時,可以把多個攔截器組成一個攔截器棧。所謂的攔截器棧是指對應各個功能的攔截器按照一定的順序排列形成的鏈,在使用時,可以將棧內的多個攔截器當成一個整體來引用。當攔截器棧被附加到一個Action上時,在執行Action之前必須先執行攔截器棧中的每一個攔截器。通常情況下,攔截器都是以代理方式調用的。
  Struts 2攔截器在Action執行前后進行攔截,圍繞著Action的執行而執行,比如實現日志管理攔截器和安全功能的攔截器,在系統的Action關聯了攔截器,添加到Action執行過程中以后,系統的整個執行流程就變為:記錄日志、執行安全檢測、執行Action、執行安全檢測、記錄日志,在執行的過程中,每一個攔截器類的攔截方法決定是傳遞請求,還是終止請求。
  2 權限控制攔截器的設計與實現
  在實際的Web應用軟件項目中,與項目的業務邏輯相關的通用功能需要開發人員自定義攔截器實現。比如Web應用軟件都要涉及到權限控制這部分,當用戶訪問系統的受保護資源時,需要先檢查用戶是否已經登錄,以及是否有權限訪問,可以由攔截器截獲用戶請求,判斷用戶是否已經登錄。
  2.1 自定義攔截器
  如果需要自定義攔截器類,該類就需要實現Interceptor接口。這個接口提供了攔截器的生命周期方法:(1)init()方法在攔截器被創建后調用,對系統相關資源進行必要的初始化工作。(2)destroy()方法在攔截器對象被銷毀之前調用,用來釋放和攔截器相關的資源。(3)intercept(ActionInvocation invocation)方法是攔截器的核心方法,用來實現具體的攔截操作,可以通過ActionInvocation參數的invoke()方法,將控制權轉給下一個攔截器或者控制器Action。如果需要自定義攔截器類,只需要實現Interceptor接口的三個方法即可。然而在實際開發過程中,更常用的一種方式是繼承抽象攔截器類AbstractIntercepter,它實現了Interceptor接口,因此可以直接繼承該抽象類,簡化代碼的編寫。
  2.2 實現權限控制攔截器
  判斷用戶是否登錄,可以跟蹤用戶的會話對象session來完成,利用ActionContext對象就可以可訪問到session中的屬性,攔截器執行攔截的intercepte方法的invocation參數可以得到ActionContext對象,通過ActionInvocation參數取得用戶的session實例的引用,從而判斷是否需要轉入登錄頁面。權限控制攔截器類intercepte方法的關鍵代碼如下:   如果用戶登錄了,就把登錄時輸入的用戶名保存在session對象的username屬性中,通過ActionContext對象獲得session,然后檢查session中是否存在username屬性,這樣就可以判斷用戶登錄與否。如果用戶已經登錄,程序就通過invocation.invoke()去執行下一攔截器或者控制器。如果檢查到用戶未登錄,那么就會返回登錄界面的邏輯視圖。
  2.3 配置權限控制攔截器
  如果要使用權限控制攔截器,還要在項目的配置文件struts.xml中定義該攔截器。由于Struts2中很多核心功能都是由系統默認的defaultStack中的攔截器實現的,所以開發人員自定義的攔截器需要引用系統默認的defaultStack,這樣Web應用才可以使用Struts 2框架提供的眾多功能。接下來可以在系統的控制器Action中引用攔截器,控制器封裝了用戶發出的增刪改查請求的方法,用戶發出的請求都首先被攔截器棧中的攔截器攔截,檢查用戶是否登錄,以及是否有足夠的權限來執行該操作,如果沒有登錄,則向用戶顯示登錄頁面,如果用戶已經登錄,則把請求傳遞給控制器相應的處理請求的方法,最后給用戶返回響應。
  3 結束語
  攔截器是Struts 2的核心組成部分,它提供了一種可以提取Action中可重復執行部分的方式,本文介紹了攔截器的設計思想和工作原理,并以軟件系統常見的權限控制為例,詳細說明了自定義攔截器的設計及配置, Web開發人員靈活運用攔截器技術可以顯著提高系統代碼的可重用性、可擴展性和靈活性。
  【參考文獻】
  [1]趙春亮,張建國,孟晨,等.基于Struts2攔截器的日志記錄的設計與實現[J].計算機與現代化,2011,2:150-153.
  [2]趙秀霞,付秀麗.基于組件和攔截器的Web系統權限設計與實現[J].現代電子技術,2014,8:105-107.
  [3]楊樹林,胡潔萍.使用Annotation和攔截器實現訪問控制[J].北京印刷學院學報,2010,2:52-54.
  [4]鄭阿奇.Java EE實用教程[M].北京:電子工業出版社,2015.102-103.作者簡介:甘文麗(1979—),女,河北邢臺人,副教授,研究方向為軟件工程、數據挖掘。
轉載注明來源:http://www.hailuomaifang.com/8/view-14839822.htm

?
99久久国产综合精麻豆