關於攔截器與過濾器使用場景、攔截器與過濾器的區別以及配置整理
轉: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的處理器攔截器類似於
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 {