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;
    }
        
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM