JavaWeb总结(九)
過濾器
-?一個中間組件,用于攔截源數據和目的數據之間的消息?
-?過濾二者之間傳遞的數據
Web應用上的過濾器?
-駐留在Web服務器上的Web組件
-過濾從客戶端傳遞到服務器端的請求和響應?
?
單個過濾器
當Web容器接收到一個對資源的請求時,它將判斷是否有過濾器器與這個資源相關聯,如果有那么容器就把請求交給過濾器進行處理。在過濾器中,我們可以更改請求的內容,或者重新設置請求頭,然后再將請求傳遞給目標資源。當目標資源對請求做出響應時,容器同樣會將響應轉發給過濾器,在過濾器中,我們可以對響應的內容進行更改,然后將響應發送回客戶端。在Web應用程序中部署過濾器,對客戶端和目標資源來說都是透明的,他們并不需要知道過濾器的存在。
Web應用上部署多個過濾器?
?
過濾器鏈
過濾器可以組成一個過濾器鏈。鏈中的每個過濾器負責特定的操作和任務,客戶端的請求和響應在這些過濾器之間傳遞?
過濾器的一些常見應用:
-?認證過濾:對用戶請求進行統一的認證。
-?登錄和審核過濾:對用戶的訪問請求進行記錄和審核。
-?圖像轉換過濾:轉換圖像格式。
-?數據壓縮過濾?:對用戶發生的數據進行壓縮,從而減少傳輸量。
-?加密過濾:對請求和響應進行加密解密處理。
-?令牌過濾
-?資源訪問觸發事件過濾?
-?XSLT過濾?
-?MIME-type過濾?
Servlet的編碼、編譯、部署
-?編碼
所有的過濾器必須實現javax.serlvet.Filter接口。實現Filter接口中定義的三個方法init()、doFilter()、destroy()。
-?編譯
添加Servlet.jar包到工程jar包目錄下。
-?部署
將編譯好的class文件放置在Web應用程序的classes目錄下
在部署文件web.xml中添加過濾器的注冊與映射
<!--指定過濾器名和過濾器類--> <filter><filter-name>HelloWorldFilter</filter-name><filter-class>com.lovobook.HelloWorldFilter</filter-class> </filter><!-- 將過濾器與URL模式關聯--><filter-mapping><filter-name>HelloWorldFilter</filter-name><url-pattern>/filter/*</url-pattern> </filter-mapping>過濾器API
由容器實現的接口?
-?javax.servlet.Filter
-?javax.servlet.FilterChain
-?javax.servlet.FilterConfig?
四個包裝器類
-?javax.servlet.ServletRequestWrapper
-?javax.servlet.ServletResponseWrapper
-?javax.servlet.http.HttpServletRequestWrapper
-?javax.servlet.http.HttpServletResponseWrapper?
Filter接口
| 方法 | 描述 |
| void?init(FilterConfig) | 在應用程序啟動時,由容器調用 |
| Void?doFilter(ServletRequest,?ServletResponse,?FilterChain) | 對于每個URL映射到該過濾器的請求,由容器調用該方法。 |
| void?destroy() | 在應用程序關閉時,由容器調用。 |
-?過濾器的生命周期方法?,過濾器API不提供Filter接口的任何實現?。自定義的過濾器必須明確地實現所有三個方法?
-?容器僅調用過濾器實例的init()方法一次。在init()方法沒有執行完前,容器不會轉發任何請求到過濾器?
-?doFilter()方法給過濾器對象一個機會來處理請求,轉發請求到過濾器鏈中的下一個組件,或者自己回復客戶端?
-?destroy()是過濾器最后一個方法來調用,以指示過濾器生命周期的結束
FilterConfig接口
-?為過濾器提供初始化參數,并將對象作為參數傳遞給過濾器的init()方法
-?提供了一個過濾器所在的應用程序ServletContext的應用
-?由Servlet容器實現?
| 方法 | 描述 |
| String?getFilterName() | 返回在部署描述文件中指定的過濾器的名稱 |
| String?getInitParameter(String) | 返回在部署描述文件中指定的參數的值 |
| Enumeration?getInitParameterNames() | 返回在部署描述文件中指定的所有參數的名稱。 |
| ServletContext?getServletContext() | 返回Web應用程序的ServletContext。過濾器可以使用ServletContext設置、獲取application范圍內的屬性。 |
FilterChain接口
-?由容器實現,由容器將其實例作為參數傳到Filter接口的doFilter()方法?
-?將請求傳遞到過濾器鏈的下一個組件?
| 方法 | 描述 |
| Void?doFilter(ServletRequest,?ServletResponse) | 我們從一個過濾器對象的doFilter()方法中調用此方法,以繼續過濾器鏈的傳遞過程。它會將控制轉到鏈中的下一個組件。 |
配置Filter
<filter>元素
?
元素層次圖
<filter><filter-name>ValidatorFilter</filter-name><description>Validates the requests</description><!--文件路徑--><filter-class>com.lovobook.filters.ValidatorFilter</filter-class><!--初始參數--><init-param><param-name>locale</param-name><param-value>USA</param-value></init-param> </filter><filter-mapping>元素
?
Filter-mapping結構圖
?
<!--所有匹配到該URL定義的請求,都要被filter-name中定義的過濾器過濾。--> <filter-mapping><filter-name>ValidatorFilter</filter-name><url-pattern>*.doc</url-pattern> </filter-mapping> <!--servlet-name用于定義一個servlet名,所有對該servlet的訪問都要被filter-name中定義的過濾器過濾 --> <filter-mapping><filter-name>ValidatorFilter</filter-name><servlet-name>reportServlet</servlet-name> </filter-mapping>配置過濾器鏈
-?用多個過濾器處理在同一個請求?
-?使用多個<filter-mapping>元素配置過濾器鏈
-?首先調用匹配請求URI的過濾器<url-pattern>
-?再查找用Servlet名匹配請求URI的所有過濾器<servlet-name>??
-?過濾器的順序按照它們在部署描述文件中出現的順序排序??
?
<filter-mapping><filter-name>FilterA</filter-name><servlet-name>RedServlet</servlet-name> </filter-mapping> <filter-mapping><filter-name>FilterB</filter-name><url-pattern>*.red</url-pattern> </filter-mapping> <servlet-mapping><servlet-name>RedServlet</servlet-name><url-pattern>*.red</url-pattern></servlet-mapping> <!--FilterA先執行?還是FilterB先執行? 容器會先調用匹配請求URI的過濾器,然后才是匹配servlet名的過濾器。因此,FilterB始終在FilterA之前調用-->?
?
使用請求和響應包裝器?
-?所有的四個包裝器類(包括ServletRequestWrapper、ServletResponseWrapper? 、HttpServletRequestWrapper、HttpServletResponseWrapper的工作方式基本相同)。這四個類在其構造器中用request或response對象作為參數,并代理對兩個對象的所有方法的調用。這樣就運行我們擴充這些類,并使用自定義的行為覆蓋類的方法
-?在請求送到過濾器鏈的下一個組件之前更改請求的內容
-?改變從前一個組件接收的響應
public class MyRequestWrapper extends HttpServletRequestWrapper { public MyRequestWrapper(HttpServletRequest req) {super(req);} //重寫接口方法 …… }public class MyResponseWrapper extends HttpServletResponseWrapper { public MyResponseWrapper(HttpServletResponse response) {super(response);} …… }
public class TextToHTMLFilter implements Filter {……public void doFilter(ServletRequest request,ServletResponse response, FilterChain filterChain) …{MyRequestWrapper mrw = new MyRequestWrapper (req);MyResponseWrapper mrsw = new MyResponseWrapper(res); filterChain.doFilter(mrw , mrsw ); } }
轉載于:https://www.cnblogs.com/HackerBlog/p/5970299.html
總結
以上是生活随笔為你收集整理的JavaWeb总结(九)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样设定目标(五)——设定目标失败的七大
- 下一篇: java占位符应用