天天看點

過濾器,攔截器,AOP之間比較

過濾器,攔截器,AOP之間比較

一、過濾器(Filter)

1.Filter的概述

package javax.servlet;

import java.io.IOException;

public interface Filter {
    default void init(FilterConfig filterConfig) throws ServletException {
    }

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    default void destroy() {
    }
}

           

由包名可知,過濾器是屬于servlet包下的,而servlet是屬于web項目中的,是以,可以知道,其實Filter是隻能用于web程式。

什麼是過濾器?

像它的名字一樣,過濾器是過濾的,那麼過濾什麼,它是過濾web請求的,他将所有的請求攔下來,可以修改請求中的request,以及相應的response(也就是過濾器可以拿到request和response這兩個對象),我們可以在其中修改實作我們的一些需求(如根據編碼格式等),這樣就不用在每一個servlet中去修改,達到了一個統一配置的效果,一般使用過程中,可能出現多個過濾器組成的過濾器鍊(如Spring security的過濾器鍊)

過濾器的執行流程:

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-lEM1GQkE-1615132770347)(C:\Users\kyg\Desktop\部落格圖檔\過濾器執行流程.png)]

由圖中可以得知,如果成功通過過濾器,doFilter()方法會執行兩次,一次是request,一次是response。

二、攔截器(Interceptor)

package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

           

攔截器攔截的也是請求,但是它和過濾器不同的是,它屬于 org.springframework.web.servlet;包,這是srping中的包,它依賴于spirng,意味這它可以擷取到spring ioc容器中的bean,如其他的service等,而過濾器是不能的。

攔截器,是基于Java反射機制實作,的,它也可以攔截請求,但是它隻能攔截controller中的請求,對其他的靜态資源請求做不到攔截,這也是和過濾器的差別之一,但是它可以做到更加全面的攔截,可以在controller前攔截做處理,可以在controller後攔截做處理等等,而過濾器隻能做一下的攔截處理。同樣,也是可以存在多個攔截器的。

單個攔截器執行流程:

過濾器,攔截器,AOP之間比較

當perHandle()方法傳回為true是,繼續執行,否則後續不執行。

多個攔截器執行流程:

參考連結

過濾器,攔截器,AOP之間比較

三、AOP(面向切面程式設計)

它相對于前面兩者,隻對請求的攔截處理,它可以針對某個方法及其中繼資料(也就是方法的參數,傳回值等)進行連接配接,顯然,它的功能超級強大。我們可以将通用的代碼,像是事務控制中的事務送出,事務開啟,送出事務等變成一個前面,随插随用,減少代碼的重複。Aop也是spring的兩大核心之一。

四、過濾器,攔截器,AOP的比較

1.三者的執行順序:

依次是過濾器(系統級别),攔截器,最後是AOP(方法級别)

2.三者的差別:
  • 使用範圍不同,過濾器僅限于web程式,而攔截器和AOP都依賴于spring,但不局限于web
  • 過濾器不能使用spring中的bean,但是攔截器可以,AOP更不用說
  • 攔截器隻能對controller的請求做攔截,對其他靜态資源的請求不能攔截,而過濾器攔截所有請求,AOP不是這個級别的。

    spring中的bean,但是攔截器可以,AOP更不用說

  • 攔截器隻能對controller的請求做攔截,對其他靜态資源的請求不能攔截,而過濾器攔截所有請求,AOP不是這個級别的。
  • AOP的攔截的粒度很細,是以相對其他二者,實作的邏輯根據複雜,也就是三者的攔截粒度和深度不一緻。