Java架構直通車——過濾器和攔截器使用

過濾器和攔截器的區別

  1. 規範不同:
    Filter是Servlet規範中定義的,是Servlet容器支持的。而攔截器是Spring容器內的,是Spring框架支持的。
  2. 作用深度不同:
    Filter在Servlet前後起作用,而攔截器可以深入到方法的前後、異常拋出前後起作用,具有更大的彈性。
  3. 從設計模式的角度分析:
    過濾器(Filter):當你有一堆東西的時候,你只希望選擇符合你要求的某一些東西。定義這些要求的工具,就是過濾器。(漏網
    攔截器(Interceptor):在一個流程正在進行的時候,你希望干預它的進展,甚至終止它進行,這是攔截器做的事情。(大壩

不過做真正實現的時候,主要還是關注第二點,在設計模式上的區分不大。

Filter過濾器

對於從 Servlet 開始入門學 Java 後臺的同學來說,Filter 過濾器這個概念應該不會陌生。Filter 過濾器主要是用來過濾用戶請求的,它允許我們對用戶請求進行前置處理和後置處理,比如實現 URL 級別的權限控制、過濾非法請求等等。Filter 過濾器是面向切面編程——AOP 的具體實現。

另外,Filter 是依賴於 Servlet 容器,Filter接口就在 Servlet 包下面,屬於 Servlet 規範的一部分。所以,很多時候我們也稱其爲“增強版 Servlet”。如果我們需要自定義 Filter 的話非常簡單,只需要實現 javax.Servlet.Filter 接口,然後重寫裏面的 3 個方法即可!

public class MyFilter implements Filter {
    // 初始化過濾器後執行的操作
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    // 對請求進行過濾
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }
    // 銷燬過濾器後執行的操作,對某些資源的回收
    @Override
    public void destroy() {

    }
}

當在 web.xml 中註冊了一個 Filter 來對某個 Servlet 程序進行攔截處理時,這個Filter 就成了 Tomcat 與該 Servlet 程序的通信線路上的一道關卡
若有多個 Filter 程序對某個 Servlet 程序的訪問過程進行攔截,當針對該 Servlet 的訪問請求到達時,web 容器將把這多個 Filter 程序組合成一個 Filter 鏈(過濾器鏈)。Filter 鏈中各個 Filter 的攔截順序與它們在應用程序的 web.xml 中映射的順序一致。

在這裏插入圖片描述
例如Mybatis會註冊一個攔截器的數組集合,然後遍歷這個攔截器數組獲取到註冊的攔截器。

Interceptor攔截器

攔截器(Interceptor)同 Filter 過濾器一樣,它倆都是面向切面編程——AOP 的具體實現。

如果你需要自定義 Interceptor 的話必須實現 org.springframework.web.servlet.HandlerInterceptor接口或繼承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter類,並且需要重寫下面下面3個方法:

public class MyInceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

preHandle方法返回 true或 false。如果返回 true,則意味着請求將繼續到達 Controller 被處理。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章