目錄
用戶的普通Http請求執行順序
過濾器、攔截器添加后的執行順序
攔截器(Interceptor)的基本定義
攔截器(Interceptor)必須實現的三個方法
單個攔截器(Interceptor)的Demo實現
攔截器(Interceptor)的兩種配置方式
過濾器(Filter)的基本定義
過濾器(Filter)必須實現的三個方法
單個過濾器(Filter)的Demo實現
過濾器(Filter)的三種配置方式
通過@WebFilter注解配置
通過@Bean來配置
Spring MVC在web.xml配置
攔截器和過濾器的區別
攔截器和過濾器的作用/用途
總結
參考文獻
攔截器是面向切面(AOP)編程中應用的一種統一處理方案,就是在你的Controller、Servie或者一個Method調用一個Method,或者在Method調用一個Method之后,統一的進行處理的方案,基于Java的反射機制。
攔截器,在AOP(Aspect-Oriented Programming)中可以用于在某個方法或者字段被訪問之前,進行攔截,然后在之前或者之后加入某些統一的處理方法。攔截是AOP的一種具象的實現方式。
攔截器將很多service或者Controller中共有的行為提煉出來,在某些方法執行的前后執行,提煉為通用的處理方式,讓被攔截的方法都能享受這一共有的功能,讓代碼更加簡潔,同時,當共有的功能需要發生調整、變動的時候,不必修改很多的類或者方法,只要修改這個攔截器就可以了,可復用性很強。
Spring MVC 中的Interceptor攔截請求是通過HandlerInterceptor來實現的。
1)總覽
2)preHandle(HttpServletRequest request, HttpServletResponse response, Object handle)方法
該方法將在請求處理之前進行調用。SpringMVC?中的Interceptor?是鏈式的調用的,在一個應用中或者說是在一個請求中可以同時存在多個Interceptor?。每個Interceptor?的調用會依據它的聲明順序依次執行,而且最先執行的都是Interceptor?中的preHandle?方法,所以可以在這個方法中進行一些前置初始化操作或者是對當前請求的一個預處理,也可以在這個方法中進行一些判斷來決定請求是否要繼續進行下去。該方法的返回值是布爾值Boolean類型的,當它返回為false?時,表示請求結束,后續的Interceptor?和Controller?都不會再執行;當返回值為true?時就會繼續調用下一個Interceptor?的preHandle?方法,如果已經是最后一個Interceptor?的時候就會是調用當前請求的Controller?方法。
3)? postHandle?(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法【前提:在當前所屬的Interceptor?的preHandle?方法的返回值為true?時才能被調用】
在當前請求進行處理之后,也就是Controller?方法調用之后執行,但是它會在DispatcherServlet?進行視圖返回渲染之前被調用,所以我們可以在這個方法中對Controller?處理之后的ModelAndView?對象進行操作。postHandle?方法被調用的方向跟preHandle?是相反的,也就是說先聲明的Interceptor?的postHandle?方法反而會后執行,這和Struts2?里面的Interceptor?的執行過程有點類型。Struts2?里面的Interceptor?的執行過程也是鏈式的,只是在Struts2?里面需要手動調用ActionInvocation?的invoke?方法來觸發對下一個Interceptor?或者是Action?的調用,然后每一個Interceptor?中在invoke?方法調用之前的內容都是按照聲明順序執行的,而invoke?方法之后的內容就是反向的。
4)afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)方法【前提:在當前所屬的Interceptor?的preHandle?方法的返回值為true?時才能被調用】
該方法將在整個請求結束之后,也就是在DispatcherServlet?渲染了對應的視圖之后執行。這個方法的主要作用是用于進行資源清理工作的。
1)初始化攔截器
2)攔截器配置類
1)同上 -> Demo實現
2)Spring MVC使用mvc:interceptors標簽??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Filter可以認為是Servlet的一種“加強版”,它主要用于對用戶請求進行預處理,也可以對HttpServletResponse進行后處理,是個典型的處理鏈。Filter也可以對用戶請求生成響應,這一點與Servlet相同,但實際上很少會使用Filter向用戶請求生成響應。使用Filter完整的流程是:Filter對用戶請求進行預處理,接著將請求交給Servlet進行處理并生成響應,最后Filter再對服務器響應進行后處理。
在Web中稱之為Filter,通過配置多個過濾器,Web系統可以對所有的Servlet請求進行一層一層的過濾,以完成一些特殊的功能。例如常用的資源訪問權限控制、特殊字符以及敏感詞過濾、響應信息壓縮等功能。
Servlet中的過濾器Filter是實現了javax.servlet.Filter接口的服務器端程序,主要的用途是設置字符集、控制權限、控制轉向、做一些業務邏輯判斷等。其工作原理是,只要你在web.xml文件配置好要攔截的客戶端請求,它都會幫你攔截到請求,此時你就可以對請求或響應(Request、Response)統一設置編碼,簡化操作;同時還可進行邏輯判斷,如用戶是否已經登陸、有沒有權限訪問該頁面等等工作。它是隨你的web應用啟動而啟動的,只初始化一次,以后就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷毀。
1)總覽
2)default void init(FilterConfig filterConfig) throws ServletException {}
用于完成Filter的初始化。
3)void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
實現過濾功能,該方法就是對每個請求及響應增加的額外處理。該方法可以實現對用戶請求進行預處理(ServletRequest request),也可實現對服務器響應進行后處理(ServletResponse response)—它們的分界線為是否調用了chain.doFilter(),執行該方法之前,即對用戶請求進行預處理;執行該方法之后,即對服務器響應進行后處理。
4)? default void destroy() {}
用于Filter銷毀前,完成某些資源的回收。
1)TestFilter初始化
2)Filter配置類
1.初始化Filter
2.web.xml文件中配置Filter
過濾器用途:用于設置字符編碼、URL級別的權限控制,敏感詞匯的過濾
攔截器用途:攔截未登錄的用戶,攔截器和過濾器的功能相近
1.過濾器:所謂過濾器顧名思義是用來過濾的,在java?web中,你傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然后再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者struts的action前統一設置字符集,或者去除掉一些非法字符(聊天室經常用到的,一些罵人的話)。filter 流程是線性的, url傳來之后,檢查之后,可保持原來的流程繼續向下執行,被下一個filter, servlet接收等.
2.java的攔截器 主要是用在插件上,擴展件上比如 hibernate spring?struts2等 有點類似面向切片的技術,在用之前先要在配置文件即xml文件里聲明一段的那個東西。
推薦:攔截器(Interceptor)與過濾器(Filter)
https://www.cnblogs.com/panxuejun/p/7715917.html《過濾器(Filter)和攔截器(Interceptor)的執行順序和區別》
https://www.cnblogs.com/junzi2099/p/8022058.html《過濾器(Filter)與攔截器(Interceptor )區別》
https://blog.csdn.net/qq_34908167/article/details/80624507《過濾器和攔截器的區別和執行順序》
https://www.cnblogs.com/feibazhf/p/11265145.html《過濾器、攔截器和監聽器區別》