1. 程式人生 > >關於攔截器與過濾器使用場景、攔截器與過濾器的區別以及配置整理

關於攔截器與過濾器使用場景、攔截器與過濾器的區別以及配置整理

轉:http://blog.csdn.net/qq_36411874/article/details/53996873

攔截器與過濾器的區別總結:

過濾器在web.xml中配置:

1)因為一開始在過濾器中對映的url-pattern填寫路徑是*.action。所有的action要經過它的過濾。<url-pattern>*.action</url-pattern>

2)因為在web.xml中配置了過濾器,所以,執行過程所有程式都經過struts2過濾器(路徑是:/*,首先過濾自己相關的程式,如xx.action,先處理,如果是.html或者.jsp就不會處理,直接放行

解決方法:把過濾器對映路徑改為:/*  ,即全部過濾處理。

<url-pattern>/*</url-pattern>


過濾器和攔截器不同,struts中攔截器是核心。

(1)過濾器(Filter):當你有一堆東西的時候,你只希望選擇符合你要求的某一些東西。定義這些要求的工具,就是過濾器。(理解:就是一堆字母中取一個B)2)攔截器(Interceptor):在一個流程正在進行的時候,你希望干預它的進展,甚至終止它進行,這是攔截器做的事情。(理解:就是一堆字母中,干預他,通過驗證的少點,順便乾點別的東西)。
攔截器與過濾器使用場景:

spring Web MVC的處理器攔截器類似於

Servlet開發中的過濾器Filter,用於對處理器進行預處理和後處理。

1、日誌記錄:記錄請求資訊的日誌,以便進行資訊監控、資訊統計、計算PV(Page View)等。

2、許可權檢查:如登入檢測,進入處理器檢測檢測是否登入,如果沒有直接返回到登入頁面;

3、效能監控:有時候系統在某段時間莫名其妙的慢,可以通過攔截器在進入處理器之前記錄開始時間,在處理完後記錄結束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);

4、通用行為:讀取cookie得到使用者資訊並將使用者物件放入請求,從而方便後續流程使用,還有如提取Locale、Theme資訊等,只要是多個處理器都需要的即可使用攔截器實現。

5、OpenSessionInView:如hibernate,在進入處理器開啟Session,在完成後關閉Session。

攔截器是AOP( Aspect-Oriented Programming)的一種實現,底層通過動態代理模式完成。

區別:

1)攔截器是基於Java反射機制的,而過濾器是基於函式回撥

2)攔截器不依賴於servlet容器,而過濾器依賴於servlet容器。

3)攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用

4)攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能。

5)action的生命週期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次。

過濾器配置:

<filter>  
    <filter-name>CharsetEncodingFilter</filter-name>  
    <filter-class>com.drp.filter.CharsetEncodingFilter</filter-class>  
  </filter>  
  <filter-mapping><!-- 此filter對所有的jsp頁面都有過濾效果 -->  
    <filter-name>CharsetEncodingFilter</filter-name>  
    <url-pattern>*.jsp</url-pattern>  
  </filter-mapping>

程式碼:

public class CharsetEncodingFilter implements Filter {  
  
    @Override  
    public void destroy() {}  
  
    @Override  
    public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain chain) throws IOException, ServletException {  
        System.out.println("CharsetEncodingFilter---->>>>Filter開始");  
        request.setCharacterEncoding("utf-8");    //設定字符集  
        chain.doFilter(request, response);    //繼續執行  
                System.out.println("CharsetEncodingFilter---->>>>Filter結束");  
    }  
  
    @Override  
    public void init(FilterConfig config) throws ServletException {}  
  
}  


攔截器配置

<mvc:interceptors>  
    <!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 -->  
    <bean class="com.host.app.web.interceptor.AllInterceptor"/>  
    <mvc:interceptor>  
        <mvc:mapping path="/test/number.do"/>  
        <!-- 定義在mvc:interceptor下面的表示是對特定的請求才進行攔截的 -->  
        <bean class="com.host.app.web.interceptor.LoginInterceptor"/>  
    </mvc:interceptor>  
</mvc:interceptors> 
程式碼:
public class SpringMVCInterceptor implements HandlerInterceptor {