javaweb——Filter(過濾器)學習_第1頁
javaweb——Filter(過濾器)學習_第2頁
javaweb——Filter(過濾器)學習_第3頁
javaweb——Filter(過濾器)學習_第4頁
javaweb——Filter(過濾器)學習_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、javawebFilter(過濾器)學習一、Filter簡介Filter也稱之為過濾器,它是Servlet技術中最激動人心的技術,WEB開發(fā)人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進行攔截,從而實現一些特殊的功能。例如實現URL級別的權限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。Servlet API中提供了一個Filter接口,開發(fā)web應用時,如果編寫的Java類實現了這個接口,則把這個java類稱之為過濾器Filter。通過Filter技術,開發(fā)人員可以實現用戶在訪問某個目標資源之前,對訪

2、問的請求和響應進行攔截,如下所示:二、Filter是如何實現攔截的?Filter接口中有一個doFilter方法,當我們編寫好Filter,并配置對哪個web資源進行攔截后,WEB服務器每次在調用web資源的service方法之前,都會先調用一下filter的doFilter方法,因此,在該方法內編寫代碼可達到如下目的:調用目標資源之前,讓一段代碼執(zhí)行。是否調用目標資源(即是否讓用戶訪問web資源)。調用目標資源之后,讓一段代碼執(zhí)行。web服務器在調用doFilter方法時,會傳遞一個filterChain對象進來,filterChain對象是filter接口中最重要的一個對 象,它也提供了一

3、個doFilter方法,開發(fā)人員可以根據需求決定是否調用此方法,調用該方法,則web服務器就會調用web資源的service方 法,即web資源就會被訪問,否則web資源不會被訪問。三、Filter開發(fā)入門3.1、Filter開發(fā)步驟Filter開發(fā)分為二個步驟:編寫java類實現Filter接口,并實現其doFilter方法。在 web.xml 文件中使用<filter>和<filter-mapping>元素對編寫的filter類進行注冊,并設置它所能攔截的資源。過濾器范例:復制代碼 1 package me.gacl.web.filter; 2 3 import j

4、ava.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest;10 import javax.servlet.ServletResponse;11 12 /*13 * ClassName: FilterDemo0114 * Description:fi

5、lter的三種典型應用:15 * 1、可以在filter中根據條件決定是否調用chain.doFilter(request, response)方法,16 * 即是否讓目標資源執(zhí)行17 * 2、在讓目標資源執(zhí)行之前,可以對requestresponse作預處理,再讓目標資源執(zhí)行18 * 3、在目標資源執(zhí)行之后,可以捕獲目標資源的執(zhí)行結果,從而實現一些特殊的功能19 * author: 孤傲蒼狼20 * date: 2014-8-31 下午10:09:2421 */ 22 public class FilterDemo01 implements Filter 23 24 Override25 p

6、ublic void init(FilterConfig filterConfig) throws ServletException 26 System.out.println("-過濾器初始化-");27 28 29 Override30 public void doFilter(ServletRequest request, ServletResponse response,31 FilterChain chain) throws IOException, ServletException 32 33 /對request和response進行一些預處理34 reques

7、t.setCharacterEncoding("UTF-8");35 response.setCharacterEncoding("UTF-8");36 response.setContentType("text/html;charset=UTF-8");37 38 System.out.println("FilterDemo01執(zhí)行前!");39 chain.doFilter(request, response); /讓目標資源執(zhí)行,放行40 System.out.println("FilterDemo

8、01執(zhí)行后!");41 42 43 Override44 public void destroy() 45 System.out.println("-過濾器銷毀-");46 47 復制代碼在web. xml中配置過濾器:復制代碼 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" 3 xmlns=" 4 xmlns:xsi="/2001/XMLSchema-

9、instance" 5 xsi:schemaLocation=" 6 7 <display-name></display-name> 8 <welcome-file-list> 9 <welcome-file>index.jsp</welcome-file>10 </welcome-file-list>11 12 <!-配置過濾器->13 <filter>14 <filter-name>FilterDemo01</filter-name>15 <fi

10、lter-class>me.gacl.web.filter.FilterDemo01</filter-class>16 </filter>17 18 <!-映射過濾器->19 <filter-mapping>20 <filter-name>FilterDemo01</filter-name>21 <!-“/*”表示攔截所有的請求 ->22 <url-pattern>/*</url-pattern>23 </filter-mapping>24 25 </web-ap

11、p>復制代碼3.2、Filter鏈在一個web應用中,可以開發(fā)編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。web服務器根據Filter在web.xml文件中的注冊順序,決定先調用哪個Filter,當第一個Filter的doFilter方法被調用時,web服務器會創(chuàng)建一個代表Filter鏈的FilterChain對象傳遞給該方法。在doFilter方法中,開發(fā)人員如果調用了FilterChain對象的doFilter方法,則web服務器會檢查FilterChain對象中是否還有filter,如果有,則調用第2個filter,如果沒有,則調用目標資源。四、Filt

12、er的生命周期4.1、Filter的創(chuàng)建Filter的創(chuàng)建和銷毀由WEB服務器負責。 web 應用程序啟動時,web 服務器將創(chuàng)建Filter 的實例對象,并調用其init方法,完成對象的初始化功能,從而為后續(xù)的用戶請求作好攔截的準備工作,filter對象只會創(chuàng)建一次,init方法也只會執(zhí)行一次。通過init方法的參數,可獲得代表當前filter配置信息的FilterConfig對象。4.2、Filter的銷毀Web容器調用destroy方法銷毀Filter。destroy方法在Filter的生命周期中僅執(zhí)行一次。在destroy方法中,可以釋放過濾器使用的資源。4.3、FilterConfi

13、g接口用戶在配置filter時,可以使用<init-param>為filter配置一些初始化參數,當web容器實例化Filter對象,調用其init方法時,會把封裝了filter初始化參數的filterConfig對象傳遞進來。因此開發(fā)人員在編寫filter時,通過filterConfig對象的方法,就可獲得:String getFilterName():得到filter的名稱。String getInitParameter(String name): 返回在部署描述中指定名稱的初始化參數的值。如果不存在返回null.Enumeration getInitParameterName

14、s():返回過濾器的所有初始化參數的名字的枚舉集合。public ServletContext getServletContext():返回Servlet上下文對象的引用。范例:利用FilterConfig得到filter配置信息復制代碼 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import java.util.Enumeration; 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.serv

15、let.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest;10 import javax.servlet.ServletResponse;11 12 public class FilterDemo02 implements Filter 13 14 /* 過濾器初始化15 * see javax.servlet.Filter#init(javax.servlet.FilterConfig)16 */17 Override18 public void init(

16、FilterConfig filterConfig) throws ServletException 19 System.out.println("-過濾器初始化-");20 /*21 * <filter>22 <filter-name>FilterDemo02</filter-name>23 <filter-class>me.gacl.web.filter.FilterDemo02</filter-class>24 <!-配置FilterDemo02過濾器的初始化參數->25 <init-par

17、am>26 <description>配置FilterDemo02過濾器的初始化參數</description>27 <param-name>name</param-name>28 <param-value>gacl</param-value>29 </init-param>30 <init-param>31 <description>配置FilterDemo02過濾器的初始化參數</description>32 <param-name>like</p

18、aram-name>33 <param-value>java</param-value>34 </init-param>35 </filter>36 37 <filter-mapping>38 <filter-name>FilterDemo02</filter-name>39 <!-“/*”表示攔截所有的請求 ->40 <url-pattern>/*</url-pattern>41 </filter-mapping>42 */43 /得到過濾器的名字44 S

19、tring filterName = filterConfig.getFilterName();45 /得到在web.xml文件中配置的初始化參數46 String initParam1 = filterConfig.getInitParameter("name");47 String initParam2 = filterConfig.getInitParameter("like");48 /返回過濾器的所有初始化參數的名字的枚舉集合。49 Enumeration<String> initParameterNames = filterCon

20、fig.getInitParameterNames();50 51 System.out.println(filterName);52 System.out.println(initParam1);53 System.out.println(initParam2);54 while (initParameterNames.hasMoreElements() 55 String paramName = (String) initParameter Names.nextElement();56 System.out.println(paramName);57 58 59 60 Override61

21、 public void doFilter(ServletRequest request, ServletResponse response,62 FilterChain chain) throws IOException, ServletException 63 System.out.println("FilterDemo02執(zhí)行前!");64 chain.doFilter(request, response); /讓目標資源執(zhí)行,放行65 System.out.println("FilterDemo02執(zhí)行后!");66 67 68 Override

22、69 public void destroy() 70 System.out.println("-過濾器銷毀-");71 72 復制代碼五、Filter的部署Filter的部署分為兩個步驟:1、注冊Filter2、映射Filter5.1、注冊Filter開發(fā)好Filter之后,需要在web.xml文件中進行注冊,這樣才能夠被web服務器調用在web.xml文件中注冊Filter范例:復制代碼 1 <filter> 2 <description>FilterDemo02過濾器</description> 3 <filter-name&

23、gt;FilterDemo02</filter-name> 4 <filter-class>me.gacl.web.filter.FilterDemo02</filter-class> 5 <!-配置FilterDemo02過濾器的初始化參數-> 6 <init-param> 7 <description>配置FilterDemo02過濾器的初始化參數</description> 8 <param-name>name</param-name> 9 <param-value>g

24、acl</param-value>10 </init-param>11 <init-param>12 <description>配置FilterDemo02過濾器的初始化參數</description>13 <param-name>like</param-name>14 <param-value>java</param-value>15 </init-param>16 </filter>復制代碼<description>用于添加描述信息,該元素的內容可

25、為空,<description>可以不配置。<filter-name>用于為過濾器指定一個名字,該元素的內容不能為空。<filter-class>元素用于指定過濾器的完整的限定類名。<init-param>元素用于為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。如果過濾器不需要指定初始化參數,那么<init-param>元素可以不配置。5.2、映射Filter在web.xml文

26、件中注冊了Filter之后,還要在web.xml文件中映射Filter1 <!-映射過濾器->2 <filter-mapping>3 <filter-name>FilterDemo02</filter-name>4 <!-“/*”表示攔截所有的請求 ->5 <url-pattern>/*</url-pattern>6 </filter-mapping><filter-mapping>元素用于設置一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑<filter-name>子

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論