1. 程式人生 > >javaWeb開發之攔截器和過濾器的區別

javaWeb開發之攔截器和過濾器的區別

攔截器和過濾的關係圖

 

攔截器和過濾器簡要區別

1、攔截器是基於java的反射機制的,而過濾器是基於函式回撥。
2、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4、攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能訪問。
5、在action的生命週期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次。
6、攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裡注入一個service,可以呼叫業務邏輯。

 

 

攔截器和過濾器的詳細區別

Filter Interceptor Summary
Filter 介面定義在 javax.servlet 包中 介面 HandlerInterceptor 定義在org.springframework.web.servlet 包中  
Filter 定義在 web.xml 中    
Filter在只在 Servlet 前後起作用。Filters 通常將 請求和響應(request/response) 當做黑盒子,Filter 通常不考慮servlet 的實現。 攔截器能夠深入到方法前後、異常丟擲前後等,因此攔截器的使用具有更大的彈性。允許使用者介入(hook into)請求的生命週期,在請求過程中獲取資訊,Interceptor 通常和請求更加耦合。 在Spring構架的程式中,要優先使用攔截器。幾乎所有 Filter 能夠做的事情, interceptor 都能夠輕鬆的實現
Filter 是 Servlet 規範規定的。 而攔截器既可以用於Web程式,也可以用於Application、Swing程式中。 使用範圍不同
Filter 是在 Servlet 規範中定義的,是 Servlet 容器支援的。 而攔截器是在 Spring容器內的,是Spring框架支援的。 規範不同
Filter 不能夠使用 Spring 容器資源 攔截器是一個Spring的元件,歸Spring管理,配置在Spring檔案中,因此能使用Spring裡的任何資源、物件,例如 Service物件、資料來源、事務管理等,通過IoC注入到攔截器即可 Spring 中使用 interceptor 更容易
Filter 是被 Server(like Tomcat) 呼叫 Interceptor 是被 Spring 呼叫 因此 Filter總是優先於interceptor執行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

攔截器和過濾器的權威區別

根據《Java Web整合開發王者歸來》一書的第28章第二節(目錄結構如下):

第28章 Spring的AOP模組 671
28.1 例項:使用攔截器攔截方法 671
28.1.1 Service介面 671
28.1.2 Service實現程式碼 671
28.1.3 方法前攔截器檢查name是否為null 672
28.1.4 返回後攔截器輸出返回值 673
28.1.5 異常攔截器捕獲異常 673
28.1.6 攔截器配置 674
28.1.7 執行程式碼 675
28.2 攔截器與Filter的區別 676
28.3 AOP的相關概念 676
28.4 AOP的代理模式 677
28.4.1 ProxyFactoryBean代理工廠物件 677
28.4.2 TransactionProxyFactoryBean事務代理工廠物件 677
28.5 本章小結 678

 截圖如下:

文字描述如下:

Spring的攔截器與Servlet的Filter有相似之處,比如二者都是AOP程式設計思想的體現,都能實現許可權檢查、日誌記錄等。不同的是:
使用範圍不同:Filter是Servlet規範規定的,只能用於Web程式中。而攔截器既可以用於Web程式,也可以用於Application、Swing程式中。
規範不同:Filter是在Servlet規範中定義的,是Servlet容器支援的。而攔截器是在Spring容器內的,是Spring框架支援的。
使用的資源不同:同其他的程式碼塊一樣,攔截器也是一個Spring的元件,歸Spring管理,配置在Spring檔案中,因此能使用Spring裡的任何資源、物件,例如Service物件、資料來源、事務管理等,通過IoC注入到攔截器即可;而Filter則不能。
深度不同:Filter在只在Servlet前後起作用。而攔截器能夠深入到方法前後、異常丟擲前後等,因此攔截器的使用具有更大的彈性。所以在Spring構架的程式中,要優先使用攔截器。

 

 

攔截器和過濾器的執行順序

 

多個Filter順序如何設定

方式一

多個filter預設使用filter名稱進行排序,也就是類名的首個字母順序,最簡單的辦法就是巧妙設定類名就可以指定順序。

根據出處:
https://blog.csdn.net/xie19900123/article/details/82082774

 

方式二

如何設定filter順序,最好是用FilterRegistrationBean(註解@Order(1)這類方式是沒有用的,可能跟版本有關)

具體順序指定程式碼如下:

@SpringBootApplication
@MapperScan("com.haizhi.mapper")
@ServletComponentScan
public class DemoApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Bean
    public FilterRegistrationBean registrationFilterBean(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new Logfilter());
        filterRegistrationBean.addUrlPatterns("/hello/*");
        filterRegistrationBean.setOrder(0);
        filterRegistrationBean.setEnabled(true);
        return filterRegistrationBean;
    }
    
    @Bean
    public FilterRegistrationBean registrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new Sessionfilter());
        filterRegistrationBean.addUrlPatterns("/hello/*");
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.setEnabled(true);
        return filterRegistrationBean;
    }
        
}