过滤器跟拦截器的区别
一、攔截器與過濾器的區別總結
1. 原理不同:攔截器是基于java的反射機制的,而過濾器是基于函數回調。
2. 依賴容器:攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
3. 作用范圍:攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
4. 訪問權限:攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
5. 作用次數:在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次
核心區別是兩者關注點不一樣:過濾器關注web請求;攔截器關注方法調用。
什么是action?action可以理解為一次請求,在程序中初學者可以把它理解為一個后綴名為.action的請求路徑。
?
二、過濾器和攔截器執行順序
????????容器初始化時執行過濾器。過濾器之間執行順序按注冊順序
????????攔截器是請求時出發,容器初始化時不會被執行。攔截器之間順序是按注冊順序
三、應用場景總結:
攔截器:
Controller日志打印、限流操作、訪問權限驗證、統一參數校驗、登錄
過濾器:
編碼過濾器、以及源碼中給出的應用實例如下
1) Authentication Filters 鑒權
2) Logging and Auditing Filters 日志和審計
3) Image conversion Filters 圖像轉換
4) Data compression Filters 數據壓縮
5) Encryption Filters 加密
6) Tokenizing Filters 令牌
7) Filters that trigger resource access events 資源訪問事件觸發
8) XSL/T filters
9) Mime-type chain Filter
四、什么是攔截器
攔截器,在AOP(Aspect-Oriented Programming)中用于在某個方法或字段被訪問之前進行攔截,然后在之前或之后加入某些操作。攔截是AOP的一種實現策略。
攔截器最早始于Struct2中,后面在SpringMVC也有大量運用。在Webwork(即Structs2框架)文檔的解釋:攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前后執行的代碼,也可以在一個action執行前阻止其執行。同時也是提供了一種可以提取action中可重用的部分的方式。
談到攔截器,還有一個詞大家應該知道——攔截器鏈(Interceptor Chain,在Struts 2中稱為攔截器棧Interceptor Stack)。攔截器鏈就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。
五、攔截器的實現原理
大部分時候,攔截器方法都是通過代理的方式來調用的。Struts 2的攔截器實現相對簡單。當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置文件,并根據其配置實例化相對的攔截器對象,然后串成一個列表(list),最后一個一個地調用列表中的攔截器。
六、什么是過濾器
過濾器是一個程序,它先于與之相關的servlet或JSP頁面運行在服務器上。過濾器可附加到一個或多個servlet或JSP頁面上,并且可以檢查進入這些資源的請求信息。在這之后,過濾器可以作如下的選擇:
①以常規的方式調用資源(即調用servlet或JSP頁面)。
②利用修改過的請求信息調用資源。
③調用資源,但在發送響應到客戶機前對其進行修改。
④阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。
七、Servlet過濾器的基本原理
在Servlet作為過濾器使用時,它可以對客戶的請求進行處理。處理完成后,它會交給下一個過濾器處理,這樣,客戶的請求在過濾鏈里逐個處理,直到請求發送到目標為止。例如,某網站里有提交“修改的注冊信息”的網頁,當用戶填寫完修改信息并提交后,服務器在進行處理時需要做兩項工作:判斷客戶端的會話是否有效;對提交的數據進行統一編碼。這兩項工作可以在由兩個過濾器組成的過濾鏈里進行處理。當過濾器處理成功后,把提交的數據發送到最終目標;如果過濾器處理不成功,將把視圖派發到指定的錯誤頁面。
總結
以上是生活随笔為你收集整理的过滤器跟拦截器的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哲学家就餐与死锁问题,死锁产生的条件以及
- 下一篇: 浅谈sql中的in与not in,exi