過濾器的基本概念html
Servlet過濾器從字面上的字意理解爲通過一層次的過濾處理才達到使用的要求,而其實Servlet過濾器就是服務器與客戶端請求與響應的中間層組件,在實際項目開發中Servlet過濾器主要用於對瀏覽器的請求進行過濾處理,將過濾後的請求再轉給下一個資源。java
Filter是在Servlet 2.3以後增長的新功能,當須要限制用戶訪問某些資源或者在處理請求時提早處理某些資源的時候,就可使用過濾器完成。web
過濾器是以一種組件的形式綁定到WEB應用程序當中的,與其餘的WEB應用程序組件不一樣的是,過濾器是採用了「鏈」的方式進行處理的。瀏覽器
Filter
服務器
Servlet過濾器Fileter是一個小型的web組件,它們經過攔截請求和響應,以便查看、提取或以某種方式操做客戶端和服務器之間交換的數據,實現「過濾」的功能。Filter一般封裝了一些功能的web組件,過濾器提供了一種面向對象的模塊化機制,將任務封裝到一個可插入的組件中, Filter組件經過配置文件來聲明,並動態的代理。app
簡單來講Servlet的Filter是:jsp
● 聲明式的:經過在web.xml配置文件中聲明,容許添加、刪除過濾器,而無需改動任何應用程序代碼或jsp頁面。模塊化
● 靈活的:過濾器可用於客戶端的直接調用執行預處理和後期的處理工做,經過過濾鏈能夠實現一些靈活的功能。post
● 可移植的:因爲現今各個web容器都是以Servlet的規範進行設計的,所以Servlet過濾器一樣是跨容器的。網站
● 可重用的:基於其可移植性和聲明式的配置方式,Filter是可重用的。
總的來講,Servlet的過濾器是經過一個配置文件來靈活的聲明的模塊化可重用組件。過濾器動態的截獲傳入的請求和傳出的響應,在不修改程序代碼的狀況下,透明的添加或刪除他們。其獨立於任何平臺和web容器。
Filter體系結構
如其名字所暗示的同樣,Servlet過濾器用於攔截傳入的請求和傳出的響應,並監視、修改處理web工程中的數據流。過濾器是一個可插入的自由組件。web資源能夠不配置過濾器、也能夠配置單個過濾器,也能夠配置多個過濾器,造成一個過濾器鏈。Filter接受用戶的請求,並決定將請求轉發給鏈中的下一個組件,或者終止請求直接向客戶端返回一個響應。若是請求被轉發了,它將被傳遞給鏈中的下一個過濾器(以web.xml過濾器的配置順序爲標準)。這個請求在經過過濾鏈並被服務器處理以後,一個響應將以相反的順序經過該鏈發送回去。這樣,請求和響應都獲得了處理。
Filter能夠應用在客戶端和Servlet之間、servlet和serlvet或jsp之間,以及jsp之間。而且能夠經過配置信息,靈活的使用那個過濾器。
基於Filter體系結構的描述,咱們能夠看出Filter的工做原理,簡單的經過一幅流程圖加以演示:
客戶端瀏覽器在訪問web服務器的某個具體資源的時候,通過過濾器1中code1代碼塊的相關處理以後,將request請求傳遞給過濾鏈中的下一個過濾器2,(過濾鏈的順序以配置文件中的順序爲基準)過濾器2處理完以後,request就傳遞的Servlet完成相應的邏輯。返回響應的過程相似,只是過濾鏈的順序相反,這裏就很少說了。
要編寫一個過濾器必須實現Filter接口。實現其接口規定的方法。
★ 實現javax.servlet.Filter接口
★ 實現init方法,讀取過濾器的初始化參數
★ 實現doFilter方法,完成對請求或響應的過濾
★ 調用FilterChain接口對象的doFilter方法,向後續的過濾器傳遞請求或響應
一個最基本的過濾器實現代碼:
java類:
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class BasicsFilter implements Filter { public BasicsFilter() { // 容器(服務器)啓動時執行 } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { /* 容器(服務器)時執行 */ System.out.println("======== 初始化方法 ========"); // 獲取的是web.xml中配置Filter時設置的值,參數爲設置值得名稱,若參數不存在,則返回空 String initParam = fConfig.getInitParameter("param"); System.out.println("param ========" + initParam); } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { /* 在訪問的時候執行 */ System.out.println("======= 開始執行doFilter ========"); // 轉發到下一個組件,進行後續的處理(組件能夠是一個過濾器,也能夠是一個servlet) chain.doFilter(request, response); System.out.println("======= 結束執行doFilter ========"); } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } }
web.xml配置:
<filter> <filter-name>basicsFilter</filter-name> <filter-class>com.hudongwu.filter.BasicsFilter</filter-class> <init-param><!-- 設置在過濾器中執行初始化方法時,獲取的值 --> <param-name>param</param-name> <param-value>studyFilter</param-value> </init-param> </filter> <filter-mapping> <filter-name>basicsFilter</filter-name> <!-- 設置爲訪問該網站全部地址都須要經過該過濾器 --> <url-pattern>/*</url-pattern> <!-- 設置爲只有訪問該網站的/Helloword地址時才經過該過濾器 --> <url-pattern>/Helloword</url-pattern> </filter-mapping>