Java 過濾器 攔截器


Java 過濾器、攔截器
============================================================
一、過濾器
Filter稱之爲過濾器,Servlet提供,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:
例如Jsp, Servlet, 靜態圖片文件或靜態html文件等進行攔截,從而實現一些特殊的功能。
例如實現URL級別的權限訪問控制、過濾敏感詞彙、壓縮響應信息等一些功能。

在應用啓動的時候就進行裝載Filter類,容器創建好Filter對象實例後,調用init()方法,
當應用服務被停止或重新裝載了,則會執行Filter的destroy方法,Filter對象銷燬。

1、實現:
    > 新建一個類,實現Filter接口,實現doFilter()方法,
    > 在web.xml中進行配置
public class Demo1Filter implements Filter {
    private FilterConfig filterConfig;

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("Demo1過濾前");
        System.out.println(filterConfig.getInitParameter("param1"));
        chain.doFilter(request, response);//放行,讓其走到下個鏈或目標資源中
        System.out.println("Demo1過濾後");
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化了");
        this.filterConfig = filterConfig;
    }

    public void destroy() {
        System.out.println("銷燬了");
    }
}
<filter>
     <filter-name>Demo1Filter</filter-name>
     <filter-class>com.itheima.filter.Demo1Filter</filter-class>
     <init-param>
         <param-name>param1</param-name>
         <param-value>value在這裏呢</param-value>
     </init-param>
 </filter>
 <filter-mapping>
     <filter-name>Demo1Filter</filter-name>
     <url-pattern>/*</url-pattern>
     <dispatcher>REQUEST</dispatcher> <!-- 沒有配置dispatcher就是默認request方式的 -->
     <dispatcher>FORWARD</dispatcher>
     <dispatcher>ERROR</dispatcher>
     <dispatcher>INCLUDE</dispatcher>
 </filter-mapping>
2、作用:
1> 通過控制對chain.doFilter的方法的調用,來決定是否需要訪問目標資源。
比如,可以在用戶權限驗證等等。判斷用戶是否有訪問某些資源的權限,有權限放行,沒權限不執行chain.doFilter方法。
2> 通過在調用chain.doFilter方法之前,做些處理來達到某些目的。
比如,解決中文亂碼的問題等等。可以在doFilter方法前,執行設置請求編碼與響應的編碼。
3> 通過在調用chain.doFilter方法之後,做些處理來達到某些目的。
比如對整個web網站進行壓縮。在調用chain.doFilter方法之後,通過response獲取ByteArrayOutputStream流,用GZIPOutputStream流進行壓縮下。

二、攔截器
1、實現:
 servlet-context.xml中配置
 <mvc:interceptors>  
        <!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 -->  
        <bean class="com.host.app.web.interceptor.AllInterceptor"/>  
        <mvc:interceptor>  
            <mvc:exclude-mapping path="/login.htm"/>
            <mvc:mapping path="/test/number.do"/>  
            <!-- 定義在mvc:interceptor下面的表示是對特定的請求才進行攔截的 -->  
            <bean class="com.web.interceptor.MyInterceptor"/>  
        </mvc:interceptor>  
    </mvc:interceptors>  

public class MyInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }

}

2、作用:
攔截所有或者某一類(例如:/user/*.do)請求,作用於action方法

三、過濾器與攔截器的區別

①攔截器是基於Java的反射機制的,而過濾器是基於函數回調。
②攔截器不依賴與servlet容器,過濾器依賴於servlet容器。
③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
④攔截器可以訪問action上下文、值棧裏的對象,而過濾器不能訪問。
⑤在action的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
⑥攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裏注入一個service,可以調用業務邏輯。

Servlet的過濾器/Spring(SpringMvc)的攔截器

攔截器是被包裹在過濾器之中的。


其實Spring的切面最靈活了

參考:
http://www.open-open.com/lib/view/open1350703788524.html
http://blog.csdn.net/chenleixing/article/details/44573495


發佈了80 篇原創文章 · 獲贊 40 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章