攔截器和過濾的關系圖
攔截器和過濾器簡要區別
1、攔截器是基於java的反射機制的,而過濾器是基於函數回調。
2、攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
6、攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯。
攔截器和過濾器的詳細區別
攔截器和過濾器的權威區別
根據《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; } }