簡單理解Struts2中攔截器與過濾器的區別及執行順序


當接收到一個httprequest , 
a) 當外部的httpservletrequest到來時 
b) 初始到了servlet容器 傳遞給一個標準的過濾器鏈 
c) FilterDispatecher會去查找相應的ActionMapper,如果找到了相應的ActionMapper它將會將控制權限交給ActionProxy 
d) ActionProxy將會通過ConfigurationManager來查找配置struts.xml 
       i. 下一步將會 通過ActionInvocation來負責命令模式的實現(包括調用一些攔截Interceptor框架在調用action之前) 
       ii. Interceptor做一些攔截或者初始的工作 
e) 一旦action返回,會查找相應的Result 
f) Result類型可以是 jsp或者freeMark 等 
g) 這些組件和ActionMapper一起返回給請求的url(注意攔截器的執行順序) 
h) 響應的返回是通過我們在web.xml中配置的過濾器 
i) 如果ActionContextCleanUp是當前使用的,則FilterDispatecher將不會清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,則將會去清理sreadlocals。 

 

 

1、攔截器是基於java反射機制的,而過濾器是基於函數回調的。
2、過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。
3、攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用。
4、攔截器可以訪問Action上下文、值棧裏的對象,而過濾器不能。
5、在Action的生命週期中,攔截器可以多次調用,而過濾器只能在容器初始化時被調用一次。

 

 

org.apache.struts2.dispatcher.FilterDispatcher的四個功能

 

org.apache.struts2.dispatcher.FilterDispatcher是Struts2的主要的Filter,負責四個方面的功能:
      (1)執行Actions
        (2)清除ActionContext
        (3)維護靜態內容
        (4)清除request生命週期內的XWork的interceptors

               另注:該過濾器應該過濾所有的請求URL。一般被設置爲/*.(過濾所有的請求!)
    具體:
        (1)執行Actions
            過濾器通過ActionMapper對象,來判斷是否應該被映射到Action.如果mapper對象指示他應該被映射,過濾鏈將會被終止,然後Action被調用。這一點非常重要,如果同時使用SiteMesh filter,則SiteMesh filter應該放到該過濾器前,否則Action的輸出將不會被裝飾。
        (2)清除ActionContext
            過濾器爲了確保內存溢出,會自動的清除ActionContext。這可能會存在一些問題,在和其它的框架集成時,例如SiteMesh。ActionContextCleanUp提供了怎麼處理這些問題的一些信息。
        (3)維護靜態內容
            過濾器也會維護在Struts2中使用的一些公共的靜態的內容,例如JavaScript文件,CSS文件等。搜索/struts/*範圍內的請求,然後將/struts/後面的值映射到一些struts的公共包中,也可以在你的類路徑中搜索。默認情況下會去查找以下包:org.apache.struts2.static.template。這樣你只用請求/struts/xhtml/styles.css,XHTML UI主題默認的樣式表將會被返回。同樣,AJAX UI組件需要的JavaScript文件,也可以在org.apache.struts2.static包中被找到。如果你想加入其它被搜索的包,在web.xml中設置filter時,通過給"actionPackages"初始參數一個逗號隔開的包列表值來設定。
            需注意的是:他會暴露一些比較敏感的信息例如,properites文件中的數據庫連接信息。
    注:過濾器支持以下初始參數:
         config - 被調入的逗號隔開的XML文件列表。
         actionPackages - 被actions掃描的逗號隔開的packages列表。
         configProviders - 逗號分隔的實現了ConfigurationProvider接口(建造Configuration時被使用)的實現類。
         * - 任意的struts常量。
    通過重載createDispatcher()方法,可以自定義dispather。
    
    屬性列表:
         (1)actionMapper:通過注入,提供一個ActionMapper實例。
         (2)dispatcher:暴露給子類一個Dispatcher實例。
         (3)encoding:存儲StrutsConstants.STRUTS_I18N_ENCODING的設置。
         (4)filterConfig:通過初始參數,提供一個FilterConfig實例。
         (5)lastModifiedCal:在緩存靜態content,提供一個格化的日期用於設定頭信息。
         (6)log:提供一個logging實例。
         (7)patchPrefixs:存儲靜態資源的路徑前綴信息。
         (8)serveStatic:存儲StrutsConstants.STRUTS_SERVE_STATIC_CONTENT的設置。
         (9)serveStaticBrowserCache:存儲StrutsConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE的設置。
    方法列表:
         (1)copy(InputStream input, OutputStream output):從input複製數據到output。
         (2)createDispatcher(FilterConfig filterConfig):創建默認的dispatcher對象,如果需要的話,子類可以重載此方法,自定義一個dispatcher對象。
         (3)destory():調用dispatcher.cleanup(),依次釋放本地線程,銷燬dispatcher對象。
         (4)doFilter(ServletRequest request, ServeltResponse response, FilterChain chain):處理一個action或處理一個請求的靜態內容。
         (5)findInputStream(String name, String packagePrefix):搜索類路徑下的靜態資源。
         (6)findStaticResoruce(String name, HttpServletRequest request, HttpServletResponse response):搜索靜態的資源,直接複製到相應response的頭信息中。
         (7)getContentType(String name):獲取指定資源的contentType。
         (8)getFilterConfig():獲取FilterConfig實例。
         (9)getServletContext():給WebLogic的一些版本提供一個工作區。

        (9)init(FilterConfig filterCongfig):創建默認的dispatcher對象和設置靜態資源的默認包信息來初始化filter。
         (10)parse(String packages):返回一個數組通過解析一個指定逗號分隔的packages列表。
         (11)prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response):對給定的request對象進行封裝返回一個封裝HttpServletRequest對象。例如顯示的處理multipart數據。
         (12)setMapper(ActionMapper actionMapper)
         (13)setEncoding(String val)
         (14)setServeStaticContent(String val)
         (15)setServeStaticBrowserCache(String val)

 

 

附:

Struts2(XWork)提供的攔截器的功能說明:

攔截器

名字

說明

Alias Interceptor

alias

在不同請求之間將請求參數在不同名字件轉換,請求內容不變

Chaining Interceptor

chain

讓前一個Action的屬性可以被後一個Action訪問,現在和chain類型的result(<result type=”chain”>)結合使用。

Checkbox Interceptor

checkbox

添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定爲false,而html默認情況下不提交沒有選中的checkbox。

Cookies Interceptor

cookies

使用配置的name,value來是指cookies

Conversion Error Interceptor

conversionError

將錯誤從ActionContext中添加到Action的屬性字段中。

Create Session Interceptor

createSession

自動的創建HttpSession,用來爲需要使用到HttpSession的攔截器服務。

Debugging Interceptor

debugging

提供不同的調試用的頁面來展現內部的數據狀況。

Execute and Wait Interceptor

execAndWait

在後臺執行Action,同時將用戶帶到一箇中間的等待頁面。

Exception Interceptor

exception

將異常定位到一個畫面

File Upload Interceptor

fileUpload

提供文件上傳功能

I18n Interceptor

i18n

記錄用戶選擇的locale

Logger Interceptor

logger

輸出Action的名字

Message Store Interceptor

store

存儲或者訪問實現ValidationAware接口的Action類出現的消息,錯誤,字段錯誤等。

Model Driven Interceptor

model-driven

如果一個類實現了ModelDriven,將getModel得到的結果放在Value Stack中。

Scoped Model Driven

scoped-model-driven

如果一個Action實現了ScopedModelDriven,則這個攔截器會從相應的Scope中取出model調用Action的setModel方法將其放入Action內部。

Parameters Interceptor

params

將請求中的參數設置到Action中去。

Prepare Interceptor

prepare

如果Acton實現了Preparable,則該攔截器調用Action類的prepare方法。

Scope Interceptor

scope

將Action狀態存入session和application的簡單方法。

Servlet Config Interceptor

servletConfig

提供訪問HttpServletRequest和HttpServletResponse的方法,以Map的方式訪問。

Static Parameters Interceptor

staticParams

從struts.xml文件中將<action>中的<param>中的內容設置到對應的Action中。

Roles Interceptor

發佈了23 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章