過濾器(Filter)
過濾器永脓,是在java web中將你傳入的request擂煞、response提前過濾掉一些信息伦连,或者提前設(shè)置一些參數(shù)拳昌。然后再傳入Servlet或Struts2的 action進(jìn)行業(yè)務(wù)邏輯處理袭异。比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉)炬藤,或者在傳入Servlet或Struts2的action前統(tǒng)一設(shè)置字符集御铃,或者去除掉一些非法字符。
攔截器(Interceptor)
攔截器沈矿,是面向切面編程(AOP上真,Aspect Oriented Program)的。就是在你的Service或者一個方法前調(diào)用一個方法羹膳,或者在方法后調(diào)用一個方法睡互。比如動態(tài)代理就是攔截器的簡單實現(xiàn),在你調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作)陵像,也可以在你調(diào)用方法后打印出字符串就珠,甚至在你拋出異常的時候做業(yè)務(wù)邏輯的操作。
簡單理解
1醒颖、過濾器就是過濾你的請求和響應(yīng)妻怎,選擇一些允許通過,一些不允許通過的泞歉。
2逼侦、攔截器就是干預(yù)一個流程的進(jìn)展匿辩,設(shè)法改變其中通過驗證的數(shù)量
倆者主要區(qū)別
①:攔截器是基于java的反射機(jī)制的,而過濾器是基于函數(shù)的回調(diào)榛丢。
②:攔截器不依賴于servlet容器铲球,而過濾器依賴于servlet容器。
③:攔截器只對action請求起作用涕滋,而過濾器則可以對幾乎所有的請求起作用睬辐。
④:攔截器可以訪問action上下文、值宾肺、棧里面的對象溯饵,而過濾器不可以。
⑤:在action的生命周期中锨用,攔截器可以多次被調(diào)用丰刊,而過濾器只能在容器初始化時被調(diào)用一次。
⑥:攔截器可以獲取IOC容器中的各個bean增拥,而過濾器不行啄巧,這點很重要,在攔截器里注入一個service掌栅,可以調(diào)用業(yè)務(wù)邏輯秩仆。
攔截器和過濾器的觸發(fā)時機(jī)也不一樣,過濾器主要是請求進(jìn)入容器后猾封,但請求進(jìn)入
servlet之前進(jìn)行預(yù)處理的澄耍。請求結(jié)束返回也是,是在servlet處理完后晌缘,返回給前端之前齐莲,過濾器包裹servlet,servlet包裹攔截器磷箕。
使用場景
SpringMVC的處理器攔截器類似于Servlet開發(fā)中的過濾器Filter选酗,用于對處理器進(jìn)行預(yù)處理和后處理。
1岳枷、日志記錄:記錄請求信息的日志芒填,以便進(jìn)行信息監(jiān)控、信息統(tǒng)計空繁、計算PV(Page View)等氢烘。
2、權(quán)限檢查:如登錄檢測家厌,進(jìn)入處理器檢測檢測是否登錄播玖,如果沒有直接返回到登錄頁面;
3饭于、性能監(jiān)控:有時候系統(tǒng)在某段時間莫名其妙的慢蜀踏,可以通過攔截器在進(jìn)入處理器之前記錄開始時間维蒙,在處理完后記錄結(jié)束時間,從而得到該請求的處理時間(如果有反向代理果覆,如apache可以自動記錄)颅痊;
4、通用行為:讀取cookie得到用戶信息并將用戶對象放入請求局待,從而方便后續(xù)流程使用斑响,還有如提取Locale、Theme信息等钳榨,只要是多個處理器都需要的即可使用攔截器實現(xiàn)舰罚。
5、OpenSessionInView:如hibernate薛耻,在進(jìn)入處理器打開Session营罢,在完成后關(guān)閉Session。