1. 程式人生 > >Java過濾器(Filter)的工作原理和程式碼演示

Java過濾器(Filter)的工作原理和程式碼演示

一、Filter簡介

  Filter也稱之為過濾器,它是Servlet技術中最激動人心的技術之一,WEB開發人員通過Filter技術,對web伺服器管理的所有web資源:例如Jsp,
Servlet, 靜態圖片檔案或靜態html檔案等進行攔截,從而實現一些特殊的功能。例如實現URL級別的許可權訪問控制、過濾敏感詞彙、壓縮響應資訊等
一些高階功能。
  Servlet API中提供了一個Filter介面,開發web應用時,如果編寫的Java類實現了這個介面,則把這個java類稱之為過濾器Filter。通過Filter

技術,開發人員可以實現使用者在訪問某個目標資源之前,對訪問的請求和響應進行攔截,Filter介面原始碼:

  1. publicabstractinterface Filter{  
  2.     publicabstractvoid init(FilterConfig paramFilterConfig) throws ServletException;  
  3.     publicabstractvoid doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain   
  4.         paramFilterChain) throws IOException, ServletException;  
  5.     publicabstractvoid destroy();  
  6. }
二、Filter是如何實現攔截的?(Filter的工作原理)

  Filter介面中有一個doFilter方法,當我們編寫好Filter,並配置對哪個web資源進行攔截後,WEB伺服器每次在呼叫web資源的service方法之前,
都會先呼叫一下filter的doFilter方法,因此,在該方法內編寫程式碼可達到如下目的:
    呼叫目標資源之前,讓一段程式碼執行。
    是否呼叫目標資源(即是否讓使用者訪問web資源)。
    呼叫目標資源之後,讓一段程式碼執行。
  web伺服器在呼叫doFilter方法時,會傳遞一個filterChain物件進來,filterChain物件是filter介面中最重要的一個物件,它也提供了一個

doFilter方法,開發人員可以根據需求決定是否呼叫此方法,呼叫該方法,則web伺服器就會呼叫web資源的service方法,即web資源就會被訪問,
否則web資源不會被訪問。

三、Filter開發流程

3.1、Filter開發步驟
Filter開發分為2步:
 * 編寫java類實現Filter介面,並實現其doFilter方法。
 * 在web.xml 檔案中使用<filter>和<filter-mapping>元素對編寫的filter類進行註冊,並設定它所能攔截的資源。

過濾器範例:

  1. import java.io.IOException;  
  2. import javax.servlet.Filter;  
  3. import javax.servlet.FilterChain;  
  4. import javax.servlet.FilterConfig;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.ServletRequest;  
  7. import javax.servlet.ServletResponse;  
  8. /** 
  9.  * @author yangcq 
  10.  * @description 過濾器Filter的工作原理 
  11.  */
  12. publicclass FilterTest implements Filter{  
  13.     publicvoid destroy() {  
  14.         System.out.println("----Filter銷燬----");  
  15.     }  
  16.     publicvoid doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {  
  17.         // 對request、response進行一些預處理
  18.         request.setCharacterEncoding("UTF-8");  
  19.         response.setCharacterEncoding("UTF-8");  
  20.         response.setContentType("text/html;charset=UTF-8");  
  21.         System.out.println("----呼叫service之前執行一段程式碼----");  
  22.         filterChain.doFilter(request, response); // 執行目標資源,放行
  23.         System.out.println("----呼叫service之後執行一段程式碼----");  
  24.     }  
  25.     publicvoid init(FilterConfig arg0) throws ServletException {  
  26.         System.out.println("----Filter初始化----");  
  27.     }  
  28. }  
在web. xml中配置過濾器:
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <web-appversion="3.0"
  3.     xmlns="http://java.sun.com/xml/ns/javaee"
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7.   <display-name></display-name>
  8.   <welcome-file-list>
  9.     <welcome-file>index.jsp</welcome-file>
  10.   </welcome-file-list>
  11.   <!--配置過濾器-->
  12.   <filter>
  13.       <filter-name>FilterTest</filter-name>
  14.       <filter-class>com.yangcq.filter.FilterTest</filter-class>
  15.   </filter>
  16.   <!--對映過濾器-->
  17.   <filter-mapping>
  18.       <filter-name>FilterTest</filter-name>
  19.       <!--“/*”表示攔截所有的請求 -->
  20.       <url-pattern>/*</url-pattern>
  21.   </filter-mapping>
  22. </web-app>
3.2、Filter鏈
  在一個web應用中,可以開發編寫多個Filter,這些Filter組合起來稱之為一個Filter鏈。web伺服器根據Filter在web.xml檔案中的註冊順序,
決定先呼叫哪個Filter,當第一個Filter的doFilter方法被呼叫時,web伺服器會建立一個代表Filter鏈的FilterChain物件傳遞給該方法。在doFilter
方法中,開發人員如果呼叫了FilterChain物件的doFilter方法,則web伺服器會檢查FilterChain物件中是否還有filter,如果有,則呼叫第2個filter,
如果沒有,則呼叫目標資源。

四,Spring框架下,過濾器的配置
    如果專案中使用了Spring框架,那麼,很多過濾器都不用自己來寫了,Spring為我們寫好了一些常用的過濾器。下面我們就以字元編碼的
過濾器CharacterEncodingFilter為例,來看一下Spring框架下,如果配置過濾器。
  1. <filter>
  2.     <filter-name>encodingFilter</filter-name>
  3.     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4.     <init-param>
  5.         <param-name>encoding</param-name>
  6.         <param-value>UTF-8</param-value>
  7.     </init-param>
  8.     <init-param>
  9.         <param-name>forceEncoding</param-name>
  10.         <param-value>true</param-value>
  11.     </

    相關推薦

    Java三大器之過濾器Filter工作原理程式碼演示

    一、Filter簡介   Filter也稱之為過濾器,它是Servlet技術中最激動人心的技術之一,WEB開發人員通過Filter技術,對web伺服器管理的所有web資源:例如Jsp, Servlet, 靜態圖片檔案或靜態html檔案等進行攔截,從而實現一些特殊的功能。例如

    Java過濾器Filter工作原理程式碼演示

    一、Filter簡介   Filter也稱之為過濾器,它是Servlet技術中最激動人心的技術之一,WEB開發人員通過Filter技術,對web伺服器管理的所有web資源:例如Jsp, Servlet, 靜態圖片檔案或靜態html檔案等進行攔截,從而實現一些特殊的

    java過濾器filter

    Filter(過濾器)簡介:       Filter 的基本功能是對 Servlet 容器呼叫 Servlet 的過程進行攔截,從而在 Servlet 進行響應處理的前後實現一些特殊的功能。在 Servlet API 中定義了三個介面類來開供開發人員編寫 Filter

    JAVA過濾器Filter與攔截器Interceptor區別及關係

    過濾器(Filter)與攔截器(Interceptor)區別: 1、過濾器是基於函式回撥,而攔截器是基於java的反射機制; 2、過濾器是servlet規範規定的,只能用於web程式中,而攔截器是在spring容器中,它不依賴servlet容器 3、過濾器可以攔截幾乎所有的

    Java三大器之過濾器Filter工作原理代碼演示

    應用 項目 isp 抽象類 con 存在 nis window rec 一、Filter簡介   Filter也稱之為過濾器,它是Servlet技術中最激動人心的技術之一,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:例如Jsp,Servlet,

    java過濾器FilterChainFilter鏈你了解嗎?(有詳細代碼)

    pan height XML throw sun filter 時也 RoCE bsp 1、什麽是過濾器? 在客戶端到服務器的過程中,當發送請求時,如果有不符合的信息將會被filter進行攔截,如果符合則會進行放行,在服務器給客戶端響應時也會進行判斷 如果有不符合

    SpringMVC的攔截器Interceptor過濾器Filter的區別與聯系

    get err 實例 分享 切面 簡介 () lee XML 一 簡介 (1)過濾器: 依賴於servlet容器。在實現上基於函數回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取

    CSS布局模型 之 浮動模型浮動的工作原理清除浮動技巧?

    浮動 浮動模型 工作原理 浮動的工作原理浮動是讓某元素脫離文檔流,在浮動框之前和之後的非定位元素會當它不存在一樣,可能沿著它的另一側垂直流動,但都為其騰出空間,塊級元素也不例外(被浮動元素占據了部分行空間的塊級元素,仍然被看作是占據了一整行,只不過是被浮動元素占據的那部分空間無法利用罷了)。浮動的

    Servlet之過濾器Filter監聽器Listener

    卸載 ons str alt 用戶 監聽 實際應用 .com except 過濾器 過濾器是一個java組件,可以攔截發送至某個servelet,jsp頁面或靜態頁面的請求,可以在響應發送到客戶之前進行攔截 工作原理: 過濾器類必須實現 Filter 接口,包含的方法如下

    spring中過濾器filter、攔截器interceptor切面aop的執行順序

    1.程式執行的順序是先進過濾器,再進攔截器,最後進切面。注意:如果攔截器中preHandle方法返回的為false時,則無法進入切面,例子如下 @RestController @RequestMapping("/user") public class UserController {

    攔截器Interceptor過濾器Filter的執行順序區別

    一、引言 本來想記錄一下關於使用者登陸和登陸之後的許可權管理、選單管理的問題,想到解決這個問題用到Interceptor,但想到了Interceptor,就想到了Filter,於是就想說一下它們的執行順序和區別。關於Interceptor解決許可權和選單管理的問題,在放

    Java多執行緒之AQSAbstractQueuedSynchronizer 實現原理原始碼分析

    章節概覽、 1、回顧 上一章節,我們分析了ReentrantLock的原始碼: 2、AQS 佇列同步器概述 本章節我們深入分析下AQS(AbstractQueuedSynchronizer)佇列同步器原始碼,AQS是用來構建鎖或者其他同步元件的基礎框架。

    過濾器Filter攔截器Interceptor的區別

    一、過濾器(Filter) 1.含義 它依賴於servlet容器,配置於web.xml。 Servlet中的過濾器Filter是實現了javax.servlet.Filter介面的伺服器端程式,主要的用途是設定字符集、控制權限、控制轉向、做一些業務邏輯判斷等。在實現上,基於函式回撥,它可

    過濾器Filter攔截器Interceptor

    Filter介紹 Filter可以認為是Servlet的一種“加強版”,它主要用於對使用者請求進行預處理,也可以對HttpServletResponse進行後處理,是個典型的處理鏈。Filter也可以對使用者請求生成響應,這一點與Servlet相同,但實際上很少

    javaWeb(十二監聽器Listener過濾器Filter

    Listener 1、Listener定義 : 監聽器內部實現其實就是介面回撥. 就像老闆寫介面方法,然後員工寫實現類,父類介面指向子類物件,多型的一種體現 2、Listener分類 : 總共有8個 劃分成三種類型 【監聽三個作用域建立和銷燬】 需要在web.

    android核心剖析學習筆記:AMSActivityManagerService內部原理工作機制

          一、ActivityManagerService提供的主要功能:        (1)統一排程各應用程式的Activity        (2)記憶體管理        (3)程序管理       二、啟動一個Activity的方式有以下幾種:

    過濾器Filter監聽器listener

    一、過濾器 Filter(過濾器)並不是一個標準的Servlet ,它不能處理使用者請求,也不能對客戶端生成響應。通過Filter技術,開發人員可以實現使用者在訪問某個目標資源之前,對訪問的請求和響應進行攔截,從而實現一些特殊的功能。例如實現URL級別的許可權訪問控制、過濾敏感詞彙、壓縮響應資訊等一些高階功

    過濾器filter攔截器intercept的區別

    面向切面程式設計(AOP是Aspect OrientedProgram的首字母縮寫),我們知道,面向物件的特點是繼承、多型和封裝。而封裝就要求將功能分散到不同的物件中去,這在軟體設計中往往稱為職責分配。實際上也就是說,讓不同的類設計不同的方法。這樣程式碼就分散到一個個的類中去了。這樣做的好處是降低了程式碼的複

    Linux時間子系統之六:高精度定時器HRTIMER原理實現

    3.4 size 屬於 running return repr 而是 復雜度 ctu 上一篇文章,我介紹了傳統的低分辨率定時器的實現原理。而隨著內核的不斷演進,大牛們已經對這種低分辨率定時器的精度不再滿足,而且,硬件也在不斷地發展,系統中的定時器硬件的精度也越來越高,這也給

    過濾器Filter

    日誌記錄 過濾 實例化 con 歸檔 web 應用 資源 ice filter 本文摘自servlet3.1規範 過濾器(Filter)是 Java 組件,允許運行過程中改變進入資源的請求和資源返回的響應中的有效負載和 header信息。本章描述了 Java Servle