Filter與Interceptor的區(qū)別
前言
在看springboot項目時,其中的會話持續(xù)時,了解到token,session,jwt等方法,但是接著我就了解到過濾器(Filter)以及攔截器(Interceptor),感覺這兩個東西真的有夠像的了,也是去看了好多篇文章。接下來就分別講一下,F(xiàn)ilter與Interceptor,最后講一下兩者的區(qū)別。(本篇參考了幾篇博客,我會在對應(yīng)處留下鏈接的)
過濾器(Filter)
基于Servlet實現(xiàn),是將java web傳入的request、以及響應(yīng)的response提前過濾掉一些信息或設(shè)置一點參數(shù)。
Filter過濾器隨web應(yīng)用的啟動而啟動,且只初始化一次。
Filter接口內(nèi),需實現(xiàn)init、doFilter以及destroy方法
void init(FilterConfig filterConfig):容器啟動會調(diào)用用于初始化,整個程序運行期只會被調(diào)用一次。
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain):doFilter為具體的過濾功能代碼。
void destroy():當(dāng)Filter 要銷毀時,進行相關(guān)資源的回收工作。
攔截器(Interceptor)
是SpringMVC中實現(xiàn)的一種基于Java反射,是在Action執(zhí)行的前后執(zhí)行一段代碼或執(zhí)行前阻止其執(zhí)行。
需實現(xiàn)preHandle、postHandle以及afterCompletion方法
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):在請求前被調(diào)用。就如我們開始說的jwt的問題,在執(zhí)行操作之前會先要驗證用戶的登錄信息,這個就可以在這個方法中實現(xiàn),如果驗證成功則返回 true,繼續(xù)執(zhí)行數(shù)據(jù)操作業(yè)務(wù);否則就返回 false,后續(xù)操作數(shù)據(jù)的業(yè)務(wù)就不會被執(zhí)行了。
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView):調(diào)用請求方法之后執(zhí)行,但它會在 DispatcherServlet (前端控制器)進行渲染視圖之前被執(zhí)行。
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):會在請求結(jié)束之后再執(zhí)行,也就是在 DispatcherServlet (前端控制器)渲染了對應(yīng)的視圖之后再執(zhí)行。
主要區(qū)別
1.Filter的生命周期由Servlet容器管理,而攔截器則可以通過IoC容器來管理。
2.過濾器是在請求進入容器后、進入servlet之前進行預(yù)處理的。請求結(jié)束返回也是,是在servlet處理完后,返回給前端之前。
就是過濾器會先執(zhí)行,然后才會執(zhí)行攔截器,執(zhí)行時機不同。
(圖片來源https://cloud.tencent.com/developer/article/2142914)

3.最簡單明了的區(qū)別(參考https://zhuanlan.zhihu.com/p/340397290)
過濾器可以修改request,而攔截器不能
過濾器需要在servlet容器中實現(xiàn),攔截器可以適用于javaEE,javaSE等各種環(huán)境
攔截器可以調(diào)用IOC容器中的各種依賴,而過濾器不能
過濾器只能在請求的前后使用,而攔截器可以詳細到每個方法
過濾器(Filter) :可以拿到原始的http請求,但是拿不到你請求的控制器和請求控制器中的方法的信息。
攔截器(Interceptor):可以拿到你請求的控制器和方法,卻拿不到請求方法的參數(shù)。
切片(Aspect): 可以拿到方法的參數(shù),但是卻拿不到http請求和響應(yīng)的對象
4.使用場景
攔截器使用場景:
登錄驗證,判斷用戶是否登錄。
權(quán)限驗證,判斷用戶是否有權(quán)限訪問資源,如校驗token
過濾器使用場景:
URL級別的權(quán)限訪問控制
過濾敏感詞匯(防止sql注入)
設(shè)置字符編碼
最后我看到一個問題:攔截器只能攔截部分web請求,這句話怎么理解?(https://segmentfault.com/a/1190000037755221#item-4-1)
攔截器的攔截,是基于java反射機實現(xiàn),攔截對象只能是實現(xiàn)了接口的類,而不能攔截url這種鏈接

浙公網(wǎng)安備 33010602011771號