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

來源:互聯網
上載者:User

   


當接收到一個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

 轉載地址:http://blog.csdn.net/d19891006/article/details/6900602


當接收到一個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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.