1. 程式人生 > >AOP--Filter使用,過濾器和攔截器的區別

AOP--Filter使用,過濾器和攔截器的區別

AOP(Aspect-Oriented Programming,面向切面程式設計)是一種程式設計思想,並不是一種具體的實現,談到實現一般有Filter和代理模式兩種常見的使用方式,Spring中的AOP也是封裝代理模式完成的,可以說是OOP(Object-Oriented Programing,面向物件程式設計)的補充和完善。OOP利用封裝、繼承和多型把一切事物打造成物件結構,但是對於所有物件中都存在的一些公共行為,OOP就顯得無能為力,也就是說OOP允許你定義從上到下的關係,但並不適合定義從左到右的關係。抽象和介面雖好,但對所有不相干的物件建立共同的介面或父類未免有些生硬,例如日誌功能,日誌程式碼幾乎散佈在所有的物件層次中,而它和散佈到物件的核心功能毫無關係,對於其他型別的程式碼,如安全性、異常處理和透明的持續性也是如此。因此,為減少這種大量的重複程式碼,面向切面技術誕生了,AOP和OOP的關係好似JSP和Servlet的關係,以此之長,補彼之短。

Java中常見的AOP技術有兩個,分別是Filter和代理模式(也可以稱為過濾器和攔截器),Filter是基於回撥函式(請看《Java回撥機制解析》),代理模式是基於Java反射技術,代理模式又分為靜態代理和動態代理,動態代理就是攔截器的簡單實現。(過濾器和攔截器的區別可參見《過濾器和攔截器的區別》)他們各自實現的功能不同,原理如出一轍。如下圖,以新增使用者為例,採用Module1架構模式,從圖中可以看出無論程式從左向右或者從右向左執行都必須經過Filter,Filter在Request到達JSP(Servlet)前截獲Request並進行預處理,也可以在Response離開JSP(Servlet)時處理Response,然後對Request進行統一的設定後繼續向後傳遞,比如可以在Filter完成字符集的設定,使用者身份的識別,敏感詞彙的過濾等等,配置Filter個數不限。

下面就以設定字符集為例,首先建立一個Class檔案,並讓他實現Filter介面,覆寫init和doFilter,程式碼如下:

  1. <span style="font-family:Arial;">package com.snail.drp.util.filter;  
  2. import java.io.IOException;  
  3. import javax.servlet.Filter;  
  4. import javax.servlet.FilterChain;  
  5. import javax.servlet.FilterConfig;  
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.ServletRequest;  
  8. import javax.servlet.ServletResponse;  
  9. publicclass CharsetEncodingFilter implements Filter {  
  10.     private String endcoding;  
  11.     @Override
  12.     publicvoid destroy() {  
  13.         // TODO Auto-generated method stub
  14.     }  
  15.     @Override
  16.     publicvoid doFilter(ServletRequest request, ServletResponse response,  
  17.             FilterChain chain) throws IOException, ServletException {  
  18.         request.setCharacterEncoding(endcoding);  
  19.         //繼續執行
  20.         chain.doFilter(request, response);    
  21.     }  
  22.     @Override
  23.     publicvoid init(FilterConfig filterConfig) throws ServletException {  
  24.         this.endcoding = filterConfig.getInitParameter("encoding");  
  25.     }  
  26. }</span>  

Filter雖不是一個Servlet,但它需要在web.xml檔案中配置之後才能使用,具體解釋看程式碼中的註釋,如下:

  1. <spanstyle="font-family:Arial;"><filter>
  2.         <filter-name>CharsetEncodingFilter</filter-name>
  3.         <filter-class>com.snail.drp.util.filter.CharsetEncodingFilter</filter-class>
  4.         <!--在Filter初始化時,設定編碼格式  -->
  5.         <init-param>
  6.             <param-name>encoding</param-name>
  7.             <param-value>GB18030</param-value>
  8.         </init-param>
  9.     </filter>
  10.     <!-- 設定Filter範圍,指對Post請求起作用 -->
  11.     <filter-mapping>
  12.         <filter-name>CharsetEncodingFilter</filter-name>
  13.         <url-pattern>*.jsp</url-pattern>
  14.     </filter-mapping>
  15.     <filter-mapping>
  16.         <filter-name>CharsetEncodingFilter</filter-name>
  17.         <url-pattern>/servlet/*</url-pattern>
  18.     </filter-mapping></span>

Filter是職責鏈模式的經典應用,從上面示例程式碼可以看出,實現了Filter介面的doFilter方法主要用於截獲Request物件,把截獲的請求處理後(設定字符集),呼叫FilterChain 介面的chain.doFilter(request,response)方法,把處理權傳遞給下一個filter。

其中,FilterChain維護了一個連結串列,連結串列中存放著配置物件的鏈條,每次使用者呼叫 一次chain.doFilter(request, response),連結串列就去取下一個配置物件,再通過配置物件 得到下一個filter,然後呼叫該filter,接著在filter裡寫的邏輯就被執行了。

 轉自:http://blog.csdn.net/bjyfb/article/details/7347663

相關推薦

AOP--Filter使用過濾器攔截區別

AOP(Aspect-Oriented Programming,面向切面程式設計)是一種程式設計思想,並不是一種具體的實現,談到實現一般有Filter和代理模式兩種常見的使用方式,Spring中的AOP也是封裝代理模式完成的,可以說是OOP(Object-Oriented P

filter過濾器 攔截區別

filter過濾器,在springmvc中還有攔截器,它們都能過濾請求,但是到底有什麼區別呢? 一、定義 攔截器 :是在面向切面程式設計的就是在你的service或者一個方法,前呼叫一個方法,或者在方法後呼叫一個方法比如動態代理就是攔截器的簡單實現,在你呼叫方法前打印出字

過濾器 攔截 6個區別別再傻傻分不清了

>本文收錄在個人部落格:[www.chengxy-nds.top](http://www.chengxy-nds.top),技術資料共享,同進步 週末有個小夥伴加我微信,向我請教了一個問題:老哥,**過濾器 (`Filter`) 和 攔截器 (`Interceptor`) 有啥區別啊?** 聽到題目我的第一

過濾器攔截有啥區別這次會了!

[toc] 這個是不久前在面試的時候遇到的一個問題,當時直接懵了,兩個單拎出來,雖然不太完全,但都大概知道可以對請求進行攔截,放在一起比較,可真是頭疼。 其實之前面試完就去學習了一波,只不過那個時候沒及時總結,現在總結一下,以免日後遇到這類問題又給忘咯。 要理解這類問題,光靠死記硬背可能當時有用,過一陣

(轉)過濾器攔截區別

null req acc 編程 字符集 work uri indexof send 1、攔截器是基於java的反射機制的,而過濾器是基於函數回調 2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器 3、攔截器只能對action請求起作用,而過濾器則可以對

過濾器攔截區別

ros sof 多次 pan 圖片路徑 cti 攔截 mic -- ---------------------siwuxie095 過濾器和攔截器的區別 過濾器:過濾器理論上能過濾任何內容,如:HTML、JSP

Java中過濾器攔截區別

區別 對象 pos ava 初始 反射機制 action 調用 反射 1.攔截器是基於java反射機制的,而過濾器是基於函數回調的。 2.過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。 3.攔截器只對action起作用,而過濾器幾乎可以對所有請求起作用

轉發重定向的區別過濾器攔截區別

spring width 客戶 截器 數據 http image 定向 框架 重定向:客戶端發起兩次請求 不會攜帶數據 轉發:服務端內部跳轉,從客戶端只發起一次請求 SpringMvc默認的跳轉方式是:轉發 SpringMvc中的攔截器:過濾進入SpringMVC

Struts2中過濾器攔截區別

過濾器和攔截器的區別:   ①攔截器是基於Java的反射機制的,而過濾器是基於函式回撥。   ②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。   ③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。   ④攔截器可以訪問acti

過濾器攔截區別action萬用字元配置struts2資料驗證

過濾器filter與攔截器interceptor區別: 1)filter基於回撥函式,interceptor基於java自身反射機制 2)filter依賴於servlet容器,interceptor與servlet容器無關 3)filter過濾範圍更大,intercept

過濾器攔截之間的關係區別

1.過濾器和攔截器的區別    1)原理不同:攔截器是基於java的反射機制,而過濾器是基於函式回撥    2)作用物件不同:攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用    3)呼叫次數不同:在action的生命週期,攔截器可以多次被呼叫,而

springBoot之配置文件的讀取以及過濾器攔截的使用

boolean nco 定義 www cheng handle mod HR out 前言 在之前的學習springBoot中,成功的實現了Restful風格的基本服務。但是想將之前的工程作為一個項目來說,那些是僅僅不夠的。可能還需要獲取自定義的配置以及添加過濾器和攔截器。

springboot環境下配置過濾器攔截

name public spring doc true 直接 war pattern long 以前我們在配置過濾器和攔截器的時候,都是一個類繼承一個接口,然後在xml中配置一下就ok 但是,但是,這是springboot的環境,沒有xml的配置。所以我們還要繼續學習啊啊

過濾器 監聽器 攔截 區別

過濾器,監聽器,攔截器 過濾器:主要的用途是過濾字元編碼,做一些業務邏輯判斷,隨你的web應用啟動而啟動,只初始化一次,以後就可以攔截相關的請求,只有當你的web應用停止或者重新部署的時候才能銷燬。 監聽器:主要作用:做一些初始化的內容新增工作、設定一些基本的內容,比如一些引數或者是一些固定

SpringBoot(十一)過濾器攔截

在做web開發的時候,過濾器(Filter)和攔截器(Interceptor)很常見,通俗的講,過濾器可以簡單理解為“取你所想取”,忽視掉那些你不想要的東西;攔截器可以簡單理解為“拒你所想拒”,關心你想要拒絕掉哪些東西,比如一個BBS論壇上攔截掉敏感詞彙。 過濾器依賴於servlet容器,

springboot(五)過濾器攔截

前言        過濾器和攔截器二者都是AOP程式設計思想的提現,都能實現諸如許可權檢查、日誌記錄等。二者有一定的相似之處,不同的地方在於: Filter是servlet規範,只能用在Web程式中,而攔截器是Spring規範,可以用在Web程式中,也可以用在

過濾器攔截區別、使用場景筆記整理

①攔截器是基於java的反射機制的,而過濾器是基於函式回撥。   ②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。   ③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。   ④攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能訪問。

springboot配置監聽器、過濾器攔截

監聽器:listener是servlet規範中定義的一種特殊類。用於監聽servletContext、HttpSession和servletRequest等域物件的建立和銷燬事件。監聽域物件的屬性發生修改的事件。用於在事件發生前、發生後做一些必要的處理。其主要可用於以下方面:

Spring過濾器攔截

什麼是攔截器 ​ 攔截器(Interceptor): 用於在某個方法被訪問之前進行攔截,然後在方法執行之前或之後加入某些操作,其實就是AOP的一種實現策略。它通過動態攔截Action呼叫的物件,允許開發者定義在一個action執行的前後執行的程式碼

過濾器攔截的認識總結

以前在學習時一直搞不清這兩者的區別,以為過濾器是servlet中的,攔截器是springmvc的,後來在做一個登入攔截的時候,發現兩者都可以實現,所以稍微的終結了一下。 下圖是過濾器和攔截聯合使用時的請求的流程 過濾器是JavaEE標準,採用函式回撥