javaWeb開發之攔截器和過濾器的區別
攔截器和過濾的關係圖
攔截器和過濾器簡要區別
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; } }