拦截器Intercepter和过滤器Filter的比较
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)
總結
以上是生活随笔為你收集整理的拦截器Intercepter和过滤器Filter的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白虎星君和孙悟空谁厉害
- 下一篇: showModalDialog和show