摘要:過濾器可以執(zhí)行的主要任務如下查詢請求并采取響應措施組織請求響應對的進一步傳遞修改請求頭和數(shù)據(jù)。在后一種情況下,過濾器負責填充響應。編寫自定義請求和響應代碼過濾器有多種方式去修改請求和響應。
filter對象可以改變請求和響應的頭信息和內(nèi)容信息。過濾器和web組件的不同之處在于,過濾器通常不會自行創(chuàng)建響應。作為替代,過濾器提供附加到任意類型的web資源的功能。因此,過濾器不該對要過濾的web資源有任何依賴。這樣,它可以由多種web資源組成。
過濾器可以執(zhí)行的主要任務如下:
查詢請求并采取響應措施
組織請求-響應對的進一步傳遞
修改請求頭和數(shù)據(jù)。你可以通過設置請求的自定義版本來完成此操作。
修改響應頭和數(shù)據(jù)。你可以通過設置響應的自定義版本來完成此操作。
與web資源相互作用
應用程序的過濾器包含認證、日志、圖片轉(zhuǎn)換、數(shù)據(jù)壓縮、數(shù)據(jù)加密、標記流、xml轉(zhuǎn)換等。
你可以給一個web資源配置0-多個過濾器,并且可以自定義過濾器的順序。過濾器鏈在包含此組件的web資源部署時指定,并且在web容器加載的時候?qū)嵗?/p>
編寫filter程序
filtering api定義在javax.servlet包中的Filter, FilterChain, and FilterConfig接口中。你可以通過實現(xiàn)Filter接口定義一個過濾器。
使用@WebFilter注解在web程序中定義過濾器。這個注解作用在類上,并且包含過濾器的元數(shù)據(jù)。過濾器注解必須定義至少一個url匹配,通過使用z注解的urlPatterns或value屬性完成這個操作。所有其他的屬性都是可選的,有默認設置。當只有一個url規(guī)則時使用value注解;當有多個url規(guī)則或需要自定義屬性時使用urlPatterns注解。
使用@WebFilter 注解的類必須實現(xiàn) javax.servlet.Filter 接口。
要將配置數(shù)據(jù)添加到過濾器中,可以使用@WebFilter注解的initParams屬性。initParams屬性包含一個 @WebInitParam 注解。下面的代碼片段定義了一個過濾器,定義了一個初始化參數(shù):
import javax.servlet.Filter; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; @WebFilter(filterName = "TimeOfDayFilter", urlPatterns = {"/*"}, initParams = { @WebInitParam(name = "mood", value = "awake")}) public class TimeOfDayFilter implements Filter { ...
Filter接口的最重要的方法是doFilter,這個方法可以執(zhí)行下列操作:
核查請求頭
定制請求對象,如果過濾器想要修改請求頭或數(shù)據(jù)
定制響應對象,如果過濾器想要修改響應頭或數(shù)據(jù)
調(diào)用過濾器鏈的下一個實體。如果當前過濾器是過濾器鏈的最后一個過濾器,并且結束目標是web資源或靜態(tài)資源,下一個實體是鏈末端的資源;否則,下一個實體是war定義的過濾器。過濾器通過調(diào)用chain對象的doFilter方法調(diào)用下一個實體,傳入調(diào)用它的請求、響應或它創(chuàng)建的包裝版本。換種說法是,filter可以通過不調(diào)用下一個實體來阻塞請求。在后一種情況下,過濾器負責填充響應。
在調(diào)用下一個實體后核查響應頭
拋出一個錯誤指示執(zhí)行流程中的錯誤
執(zhí)行doFilter,你必須實現(xiàn)init和destroy方法。init方法在web容器實例化的時候調(diào)用;如果你想給filter傳入初始化參數(shù),可以通過傳入init方法的FilterConfig參數(shù)獲取它們。
編寫自定義請求和響應代碼過濾器有多種方式去修改請求和響應。例如,一個過濾器可以向請求添加一個參數(shù)或者在響應中插入數(shù)據(jù)。
過濾器修改響應必須在響應返回客戶端之前捕獲響應。為此, 您將一個替代流傳遞給生成響應的servlet。備用流阻止servlet在完成時關閉原始響應流,并允許過濾器修改servlet的響應。
要將此替換流傳遞給servlet,過濾器會創(chuàng)建一個響應包裝器,它會覆蓋getWriter或getOutputStream方法以返回此替換流。這個包裝器通過過濾器鏈doFilter方法傳遞。包裝器方法默認調(diào)用包裝的請求或響應對象。
重寫請求方法,你包裝的請求必須繼承ServletRequestWrapper或HttpServletRequestWrapper。重寫響應方法,你的響應必須繼承ServletResponseWrapper or HttpServletResponseWrapper。
web容器使用請求映射決定給web資源應用具體的過濾器。過濾器映射使用名稱映射一個過濾器到web組件或者使用url規(guī)則匹配到web資源。過濾器按照war中定義的順序執(zhí)行。您可以使用NetBeans IDE或使用XML手動編寫列表來為其部署描述符中的WAR指定過濾器映射列表。
如果你想記錄每一個到web應用的請求,你可以將過濾器映射到url規(guī)則“/”。
可以映射filter到一個或多個web資源,當然你也可以給一個web資源映射多個filter。參見下圖,F(xiàn)1映射到S1、S2、S3,F2映射到S2,F3映射到S1、S2.
再次強調(diào),filter chain是傳入filter的doFilter方法的一個參數(shù)。該鏈通過過濾器映射間接生成。鏈中的過濾器順序與過濾器映射在Web應用程序部署描述符中的顯示順序相同。當一個過濾器映射到S1,web容器調(diào)用F1的doFilter方法。S1的過濾器鏈中每個過濾器的doFilter方法由鏈中的前一個過濾器通過chain.doFilter方法調(diào)用。因為S1的過濾器鏈包含過濾器F1和F3,所以F1對chain.doFilter的調(diào)用會調(diào)用過濾器F3的doFilter方法。 當F3的doFilter方法完成時,控制返回F1的doFilter方法。
在Project節(jié)點展開應用程序
展開Project節(jié)點下的Web Pages and WEB-INF節(jié)點
雙擊web.xml
點擊編輯窗口最上方的Filters
展開編輯窗口的Servlet Filters節(jié)點
點擊Add Filter Element 添加filter與web資源的url映射關系
在添加servlet filter接口,填寫filtername
點擊Browse定位filter適用的servlet
點擊ok
要約束過濾器應用于請求的方式,步驟如下:
a. 展開Filter Mappings節(jié)點
b. 從filterlist中選擇一個filter
c. 點擊add
d. 在添加映射彈窗,需要選擇一個轉(zhuǎn)發(fā)類型:
REQUEST:只映射直接從客戶端過來的請求
ASYNC:只映射直接從客戶端過來的的異步async請求
FORWARD:只有當請求被轉(zhuǎn)發(fā)到組件時
INCLUDE : 僅當請求由已包含的組件處理時
ERROR:僅在使用錯誤頁面機制處理請求時
通過選擇多個調(diào)度程序類型,可以指示過濾器應用于上述情況的任意組合。 如果未指定類型,則默認選項為REQUEST
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73934.html
摘要:幸好,給我們提供了過濾器解決這個問題??梢詫⒁粋€或多個過濾器附加到一個或一組。同樣的,過濾器是可用于編程的類,也需要在中聲明的。用戶訪問后續(xù)過濾器。過濾器和攔截器是兩個完全不同的概念。 聽說你改bug很厲害,幫我改一個吧????showImg(https://segmentfault.com/img/bVMsm7?w=402&h=223); 上一章我們講到了Servlet請求,可以通過...
摘要:元素用于指定過濾器的完整的限定類名。除此之外,過濾器不會被調(diào)用。參數(shù)用于訪問后續(xù)過濾器。還可以為指定目標資源為某個,例如當用戶訪問時,會執(zhí)行名字為的,這時會執(zhí)行過濾器。防止中文亂碼過濾器項目使用框架時。 文章首發(fā)在CSDN博客,轉(zhuǎn)載請務必注明以下所有鏈接,否則考慮法律追究責任。 CSDN地址:http://blog.csdn.net/tzs_1041218129/article/det...
摘要:中的異步處理指的是什么中的異步處理指的是什么答在中引入了一項新的技術可以讓異步處理請求。開啟異步處理代碼開啟異步支持啟動異步處理的上下文在此處添加異步處理的代碼如果文章有錯的地方歡迎指正,大家互相交流。 以下我是歸納的過濾器監(jiān)聽器知識點圖: showImg(https://segmentfault.com/img/remote/1460000013263166?w=3974&h=187...
摘要:無論對開發(fā)人員或者測試人員來說,都是非常有用的工具。只顯示指定的多個顯示多個相關的情況下,使用英文分號隔開,見下圖。使用瀏覽器獲取圖片屬性需要注意的是刷新是使用強制刷新,這樣會重新請求資源。 ...
摘要:我們很容易發(fā)現(xiàn),過濾器可以比喻成一張濾網(wǎng)。這究竟是怎么回事啊我們可以這樣理解過濾器不單單只有一個,那么我們怎么管理這些過濾器呢在中就使用了鏈式結構。第一種方式在文件中配置用于注冊過濾器用于為過濾器指定一個名字,該元素的內(nèi)容不能為空。 什么是過濾器 過濾器是Servlet的高級特性之一,也別把它想得那么高深,只不過是實現(xiàn)Filter接口的Java類罷了! 首先,我們來看看過濾器究竟Web...
閱讀 852·2021-11-16 11:56
閱讀 1676·2021-11-16 11:45
閱讀 3124·2021-10-08 10:13
閱讀 4113·2021-09-22 15:27
閱讀 734·2019-08-30 11:03
閱讀 653·2019-08-30 10:56
閱讀 957·2019-08-29 15:18
閱讀 1750·2019-08-29 14:05