拦截器Intercepter和过滤器Filter的比较
1、攔截器是基于java反射機(jī)制的,而過濾器是基于函數(shù)回調(diào)的。
2、過濾器依賴于servlet容器,而攔截器不依賴于servlet容器。
3、攔截器只能對(duì)Action請(qǐng)求起作用,而過濾器則可以對(duì)幾乎所有請(qǐng)求起作用。
4、攔截器可以訪問Action上下文、值棧里的對(duì)象,而過濾器不能。
5、在Action的生命周期中,攔截器可以多次調(diào)用,而過濾器只能在容器初始化時(shí)被調(diào)用一次。
?
?
org.apache.struts2.dispatcher.FilterDispatcher的四個(gè)功能
?
org.apache.struts2.dispatcher.FilterDispatcher是Struts2的主要的Filter,負(fù)責(zé)四個(gè)方面的功能:
????? (1)執(zhí)行Actions
??????? (2)清除ActionContext
??????? (3)維護(hù)靜態(tài)內(nèi)容
??????? (4)清除request生命周期內(nèi)的XWork的interceptors
????????????? ?另注:該過濾器應(yīng)該過濾所有的請(qǐng)求URL。一般被設(shè)置為/*.(過濾所有的請(qǐng)求!)
??? 具體:
??????? (1)執(zhí)行Actions
??????????? 過濾器通過ActionMapper對(duì)象,來判斷是否應(yīng)該被映射到Action.如果mapper對(duì)象指示他應(yīng)該被映射,過濾鏈將會(huì)被終止,然后Action被調(diào)用。這一點(diǎn)非常重要,如果同時(shí)使用SiteMesh filter,則SiteMesh filter應(yīng)該放到該過濾器前,否則Action的輸出將不會(huì)被裝飾。
??????? (2)清除ActionContext
??????????? 過濾器為了確保內(nèi)存溢出,會(huì)自動(dòng)的清除ActionContext。這可能會(huì)存在一些問題,在和其它的框架集成時(shí),例如SiteMesh。ActionContextCleanUp提供了怎么處理這些問題的一些信息。
??????? (3)維護(hù)靜態(tài)內(nèi)容
??????????? 過濾器也會(huì)維護(hù)在Struts2中使用的一些公共的靜態(tài)的內(nèi)容,例如JavaScript文件,CSS文件等。搜索/struts/*范圍內(nèi)的請(qǐng)求,然后將/struts/后面的值映射到一些struts的公共包中,也可以在你的類路徑中搜索。默認(rèn)情況下會(huì)去查找以下包: org.apache.struts2.static.template。這樣你只用請(qǐng)求/struts/xhtml/styles.css,XHTML UI主題默認(rèn)的樣式表將會(huì)被返回。同樣,AJAX UI組件需要的JavaScript文件,也可以在org.apache.struts2.static包中被找到。如果你想加入其它被搜索的包,在web.xml中設(shè)置filter時(shí),通過給"actionPackages"初始參數(shù)一個(gè)逗號(hào)隔開的包列表值來設(shè)定。
????????????需注意的是:他會(huì)暴露一些比較敏感的信息例如,properites文件中的數(shù)據(jù)庫連接信息。
????注:過濾器支持以下初始參數(shù):
???????? config - 被調(diào)入的逗號(hào)隔開的XML文件列表。
???????? actionPackages - 被actions掃描的逗號(hào)隔開的packages列表。
???????? configProviders - 逗號(hào)分隔的實(shí)現(xiàn)了ConfigurationProvider接口(建造Configuration時(shí)被使用)的實(shí)現(xiàn)類。
???????? * - 任意的struts常量。
????通過重載createDispatcher()方法,可以自定義dispather。
????
????屬性列表:
???????? (1)actionMapper:通過注入,提供一個(gè)ActionMapper實(shí)例。
???????? (2)dispatcher:暴露給子類一個(gè)Dispatcher實(shí)例。
???????? (3)encoding:存儲(chǔ)StrutsConstants.STRUTS_I18N_ENCODING的設(shè)置。
???????? (4)filterConfig:通過初始參數(shù),提供一個(gè)FilterConfig實(shí)例。
???????? (5)lastModifiedCal:在緩存靜態(tài)content,提供一個(gè)格化的日期用于設(shè)定頭信息。
???????? (6)log:提供一個(gè)logging實(shí)例。
???????? (7)patchPrefixs:存儲(chǔ)靜態(tài)資源的路徑前綴信息。
???????? (8)serveStatic:存儲(chǔ)StrutsConstants.STRUTS_SERVE_STATIC_CONTENT的設(shè)置。
???????? (9)serveStaticBrowserCache:存儲(chǔ)StrutsConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE的設(shè)置。
????方法列表:
???????? (1)copy(InputStream input, OutputStream output):從input復(fù)制數(shù)據(jù)到output。
???????? (2)createDispatcher(FilterConfig filterConfig):創(chuàng)建默認(rèn)的dispatcher對(duì)象,如果需要的話,子類可以重載此方法,自定義一個(gè)dispatcher對(duì)象。
???????? (3)destory():調(diào)用dispatcher.cleanup(),依次釋放本地線程,銷毀dispatcher對(duì)象。
???????? (4)doFilter(ServletRequest request, ServeltResponse response, FilterChain chain):處理一個(gè)action或處理一個(gè)請(qǐng)求的靜態(tài)內(nèi)容。
???????? (5)findInputStream(String name, String packagePrefix):搜索類路徑下的靜態(tài)資源。
???????? (6)findStaticResoruce(String name, HttpServletRequest request, HttpServletResponse response):搜索靜態(tài)的資源,直接復(fù)制到相應(yīng)response的頭信息中。
???????? (7)getContentType(String name):獲取指定資源的contentType。
???????? (8)getFilterConfig():獲取FilterConfig實(shí)例。
???????? (9)getServletContext():給WebLogic的一些版本提供一個(gè)工作區(qū)。
??????? (9)init(FilterConfig filterCongfig):創(chuàng)建默認(rèn)的dispatcher對(duì)象和設(shè)置靜態(tài)資源的默認(rèn)包信息來初始化filter。
???????? (10)parse(String packages):返回一個(gè)數(shù)組通過解析一個(gè)指定逗號(hào)分隔的packages列表。
???????? (11)prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response):對(duì)給定的request對(duì)象進(jìn)行封裝返回一個(gè)封裝HttpServletRequest對(duì)象。例如顯示的處理multipart數(shù)據(jù)。
???????? (12)setMapper(ActionMapper actionMapper)
???????? (13)setEncoding(String val)
???????? (14)setServeStaticContent(String val)
???????? (15)setServeStaticBrowserCache(String val)
總結(jié)
以上是生活随笔為你收集整理的拦截器Intercepter和过滤器Filter的比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白虎星君和孙悟空谁厉害
- 下一篇: showModalDialog和show