web.xml 過濾器 — 函數回調,指責鏈模式
1、 Filter作用
當客戶端發出Web資源的請求時,Web服務器根據應用程序配置文件web.xml設置的過濾規則,能夠在一個request到達servlet之前預處理request,也可以在離開servlet時處理response。 —— filter實際是一個servlet chaining(servlet 鏈)
-
在servlet被調用之前截獲;
-
在servlet被調用之前檢查servlet request;
-
根據需要修改request頭和request數據;
-
在servlet被調用之后截獲.
-
根據需要修改response頭和response數據;
2、 過濾器生命周期的四個階段:
-
實例化:Web容器在部署Web應用程序時對所有過濾器進行實例化。Web容器回調它的無參構造方法。
-
初始化:實例化完成之后,馬上進行初始化工作。Web容器回調init()方法。
-
過濾:請求路徑匹配過濾器的URL映射時。Web容器回調doFilter()方法——主要的工作方法。
-
銷毀: Web容器在卸載Web應用程序前,Web容器回調destroy()方法。
3、 過濾器接口介紹
-
init(用來初始化)
-
dofilter(用來執行具體的操作)
此方法是由Servlet容器提供給開發者的,用於對資源請求過濾鏈的依次調用,通過FilterChain調用過濾鏈中的下一個過濾器,如果是最后一個過濾器,則下一個就調用目標資源。 -
destory(用來銷毀)
4、攔截方式
-
request過濾器(默認):只有直接訪問該目標資源時執行。包括:在地址欄中直接訪問、表單提交、超鏈接、重定向
-
forward過濾器:轉發訪問執行過濾器。包括RequestDispatcher#forward()方法,標簽都是轉發訪問;
-
include過濾器:包含訪問執行過濾器。包括RequestDispatcher#include()方法,標簽都是包含訪問;
-
error過濾器:配置,出現該異常代碼時,執行過濾器。
1 <filter> 2 <filter-name>patronliFilter</filter-name>//定義名字 3 <filter-class>com.servlet.DemoFilter</filter-class>//實現類 4 </filter> 5 <filter-mapping> 6 <filter-name>DemoFilter</filter-name> 7 <url-pattern>/*</url-pattern> 8 <!-- 過濾器攔截規則:request過濾器,include過濾器,forward過濾器,error過濾器 --> 9 <dispatcher>REQUEST</dispatcher> 10 <dispatcher>FORWARD</dispatcher> 11 </filter-mapping> 12 <!-- 如果想要配置多個攔截器,可以依次向下寫 -->
1 import javax.servlet.Filter; //過濾器接口 2 import javax.servlet.FilterChain; //過濾器鏈接口 3 import javax.servlet.FilterConfig; //過濾器配置接口,getInitParameter方法用於獲取web.xml中的初始化參數 4 5 public class DemoFilter implements Filter{ 6 protected FilterConfig config; 7 protected String encoding; 8 9 @Override //初始化的方法 10 public void init(FilterConfig config) throws ServletException { 11 this.config=config; 12 this.encoding = config.getInitParameter("encoding"); //通過init-param設置參數,在init中取得 13 } 14 15 @Override //執行過濾的方法 16 public void doFilter(ServletRequest arg0, ServletResponse arg1, 17 FilterChain arg2) throws IOException, ServletException { 18 request.setCharacterEncoding(encoding); 19 System.out.println("Do...before.."); 20 chain.doFilter(request, response); //由該方法進入下一過濾鏈。(filter攔截棧,后進先出) 21 System.out.println("Do..after..."); 22 } 23 24 @Override //銷毀的方法 25 public void destroy() { 26 } 27 }