1. 程式人生 > >過濾器和攔截器之間的關係和區別

過濾器和攔截器之間的關係和區別

1.過濾器和攔截器的區別
   1)原理不同:攔截器是基於java的反射機制,而過濾器是基於函式回撥
   2)作用物件不同:攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用
   3)呼叫次數不同:在action的生命週期,攔截器可以多次被呼叫,而過濾器只能在容器初始化
      時被呼叫一次
   4) 攔截器不依賴於servlet容器,過濾器依賴於servlet容器
   5) 攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能訪問
   6)攔截器可以獲取IOC容器中的各個bean,而過濾器不行,這點很重要,在攔截器裡注入一個
      service,可以呼叫業務邏輯。
2.描述
   過濾器是javaEE標準,採用函式回撥的方式進行。是在請求進入容器之後,還未進入servlet之
前進行預處理,並且在請求結束返回個前端這之間進行後期處理。
   攔截器是被包裹在 過濾器之中的。
總結:攔截器主要在請求許可權鑑定方面有很大用處。


3.過濾器的概念
--過濾器在請求與響應的哪個階段發揮作用
--多個過濾器的使用
  3.1 什麼樣的需求讓過濾器出現?
    1)針對所有的servlet,產品經理想要了解從請求到響應之間的時間差
    2)針對某些特定給的頁面,客戶希望只有特定幾個使用者才可以瀏覽
    3)基於安全方面的考慮,使用者輸入的特定字元必須過濾並替換為無害的字元
    4)請求與響應的編碼從Big5改用UTF-8
    3.1.1 分析這些需求:
執行servlet的service前,記錄起始時間,servlet的service的方法執行後,記錄結束時間並計算時間差
執行servlet的service前,驗證是否為允許的使用者
   執行servlet的service前,對請求引數盡心字元過濾與替換
執行servlet的service前,對請求和響應物件設定編碼格式
    總結:經過分析,發現這些需求,可以在真正執行servlet的service方法前與servlet的service
 方法後中間進行實現。
    3.1.2 這些需求有哪些?
1)5)效能評測(開發階段才需要,上線後去掉):例如計算時間差
2)使用者驗證
3)字元替換
 4)編碼轉換
5)壓縮--->響應
       這類的需求應該設計為獨立的元件,隨時可以加入到應用程式當中,也隨時可以移除,或隨時
    可以修改設定而不用修改原有的程式。
---->servlet/jsp提供過濾器機制讓你實現這些元件服務
    3.1.3 靈活的使用規則
1)可以根據需求替換過濾器或調整過濾器的順序
2)也可以針對不同的url使用不同的過濾器
 3)甚至在不同的servlet間請求轉發或包含是使用過濾器
4.實現和設定過濾器
   如何編寫一個過濾器
1)必須實現Filter介面
該介面只有一個方法:boolean isLoggable(LogRecord record) 檢查是否應該釋出給定的日誌記錄。 
  init(FilterConfig filterConfig)
filterConfig:類似於servlet介面init()方法引數上的ServletConfig,代表過濾器在web.xml
        中配置的資訊。
  doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
·類似於servlet介面的service()方法,在請求來到容器,容器發現呼叫Servlet的service之前,
可以應用某個過濾器,呼叫它的doFilter方法。 
執行完doFilter()後,決定是否決定呼叫FilterChain的doFilter()方法
如果呼叫FilterChain的doFilter()方法,就會執行下一個過濾器;如果沒有
    下一個過濾器,就呼叫請求目標servlet的service()。
如果因為某個情況(例如使用者沒有通過驗證)而沒有呼叫FilterChain的doFilter()
    則請求不會繼續交給接下來的過濾器或目標servlet,這就是所謂的攔截請求(攔截器)。
只需要知道FilterChain執行後會以堆疊順序返回即可。
  destroy()