1.過濾器 -> 通過集成Filter實現. 缺點如下
- 可以獲取原始的http請求與響應漓藕,但是無法獲取請求要訪問的類與方法,以及參數(例如:拿不到你請求的控制器和請求控制器中的方法的信息)
2.攔截器 -> 基于springmvc提供的攔截器接口,自定義實現.缺點如下
- 可以獲取請求訪問的類與方法 , 但是無法獲取請求參數的值. (例如:可以拿到你請求的控制器和方法,卻拿不到請求方法的參數)挟裂,具體可根據dispatcherServlet跟蹤源碼
3.切面 -> 基于spring , 通過aspect注解實現.缺點如下
- 可以獲取訪問的類享钞、方法以及參數值. 但是無法獲取http原始的請求與響應的對象
4.執(zhí)行順序
- 1 請求處理順序
過濾器 -> 攔截器 -> 切面 - 2 報錯處理順序
切面 -> controllerAdvice -> 攔截器 -> 過濾器 -> 服務
過濾器(Filter):
????它依賴于servlet容器
。在實現上诀蓉,基于函數回調
栗竖,它可以對幾乎所有請求進行過濾是鏈式處理
的,過濾順序按照web.xml中配置的順序渠啤,但是缺點是一個過濾器實例只能在容器初始化時調用一次
狐肢。使用過濾器的目的,是用來做一些過濾操作沥曹,獲取我們想要獲取的數據份名,比如:在Javaweb中,對傳入的request妓美、response提前過濾掉一些信息僵腺,或者提前設置一些參數,然后再傳入servlet或者Controller進行業(yè)務邏輯操作壶栋。通常用的場景是:在過濾器中修改字符編碼(CharacterEncodingFilter)想邦、在過濾器中修改HttpServletRequest的一些參數(XSSFilter(自定義過濾器)),如:過濾低俗文字委刘、危險字符等丧没。
攔截器(Interceptor):
????它依賴于web框架
鹰椒,在SpringMVC中就是依賴于SpringMVC框架。在實現上,基于Java的反射機制呕童,屬于面向切面編程(AOP)的一種運用
漆际,就是在service或者一個方法前,調用一個方法夺饲,或者在方法后奸汇,調用一個方法,比如動態(tài)代理就是攔截器的簡單實現往声,在調用方法前打印出字符串(或者做其它業(yè)務邏輯的操作)擂找,也可以在調用方法后打印出字符串,甚至在拋出異常的時候做業(yè)務邏輯的操作浩销。由于攔截器是基于web框架的調用贯涎,因此可以使用Spring的依賴注入(DI)進行一些業(yè)務操作,同時一個攔截器實例在一個controller生命周期之內可以多次調用慢洋。但是缺點是只能對controller請求進行攔截塘雳,對其他的一些比如直接訪問靜態(tài)資源的請求則沒辦法進行攔截處理。
面向切面(AOP):
????可以具體的攔截到方法
普筹,只能攔截Spring管理Bean的訪問(業(yè)務層Service)
败明。 具體AOP詳情參照 Spring AOP:原理、 通知太防、連接點妻顶、切點、切面蜒车、表達式
實際開發(fā)中讳嘱,AOP常和事務結合:Spring的事務管理:聲明式事務管理(切面)
AOP操作可以對操作進行橫向的攔截,最大的優(yōu)勢在于他可以獲取執(zhí)行方法的參數( ProceedingJoinPoint.getArgs() )醇王,對方法進行統(tǒng)一的處理
呢燥。
Aspect : 可以自定義切入的點崭添,有方法的參數寓娩,但是拿不到http請求,可以通過其他方式如RequestContextHolder獲得:
ServletRequestAttributes servletRequestAttributes=
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
常見使用日志呼渣,事務棘伴,請求參數安全驗證等
過濾器跟攔截器的區(qū)別
過濾器在一個request進入servlet之前,處理request內容屁置。在response返回客戶端之前焊夸,處理response內容。而攔截器是無法操作request蓝角、response的內容的阱穗。
過濾器只在request進入servlet 前后進行處理饭冬,而攔截器精確到方法,典型的AOP(面向切面編程)揪阶。
過濾器是JavaEE標準昌抠,所以過濾器值能在servlet容器(例如Tomcat)中實現,而攔截器可以用于JavaEE鲁僚,JavaSE中炊苫。
過濾器可以對所有請求起作用,而攔截器只能對action起作用冰沙。
過濾器無法訪問action上下文侨艾、值棧里的對象,而攔截器可以拓挥。
在action生命周期里面唠梨,過濾器只在容器初始化時被調用一次,而攔截器可以被多次調用撞叽。
綜上:過濾器更多的是用來做權限校驗姻成,編碼統(tǒng)一修改等。而攔截器適合于日志等愿棋。
網上拿的圖↓↓↓
參考鏈接:https://blog.csdn.net/qq_34531925/article/details/81184740
參考鏈接:https://www.cnblogs.com/convict/p/10374665.html
參考鏈接:https://blog.csdn.net/qq_39443053/article/details/96455280