最近在面試的時候,被問到了這個問題,以爲答得不是很好,在此進行整理和記錄,供本身學習,也但願能幫助到你們。java
在java的javax.servlet下有一個接口Filter。任何實現了Filter接口的類均可以稱之爲filter。Filter的主要用途是設置字符集、控制權限、控制轉向等等。在使用filter的過程當中,若是是傳統的web項目,帶有web.xml文件這種。咱們須要在xml裏面進行配置。好比下面這樣。web
<filter> <description>字符集過濾器</description> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <description>字符集編碼</description> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
這種使用方式直接將咱們的請求和響應的字符集所有改成utf-8的形式。面試
若是是在spingboot這種項目中使用,咱們定義好本身的filter類以後,須要使用filterregisterbean將filter進行注入。
spring
Filter隨着項目的啓動而啓動,只初始化一次,隨着web項目的中止而銷燬。app
Filter主要用於對用戶請求的預處理和程序返回response的後處理。能夠在請求到達servlet以前進行request的處理或者添加頭和一些其餘數據。或者在reponse到達以前,修改response的頭和數據。框架
filter中總共有三個方法。
void init(FilterConfig config):用於完成Filter的初始化。
void destory():用於filter銷燬前,完成資源的回收。
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):該方法是filter的核心過濾方法。經過request進行請求處理,而後調用chain.doFilter。調用完以後,能夠經過response進行響應處理。post
攔截器是aop的一種實現方案,是aop思想的體現。在咱們調用方法以前,調用攔截器的一個方法或者在調用方法以後,調用攔截器的一個方法。學習
SpringMVC 中的Interceptor 攔截請求是經過HandlerInterceptor 來實現的。在SpringMVC 中定義一個Interceptor 很是簡單,主要有兩種方式,第一種方式是要定義的Interceptor類要實現了Spring 的HandlerInterceptor 接口,或者是這個類繼承實現了HandlerInterceptor 接口的類,好比Spring 已經提供的實現了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter ;第二種方式是實現Spring的WebRequestInterceptor接口,或者是繼承實現了WebRequestInterceptor的類。編碼
(1)preHandle (HttpServletRequest request, HttpServletResponse response, Object handle) 方法,該方法將在請求處理以前進行調用。SpringMVC 中的Interceptor 是鏈式調用,在一個應用中或者說是在一個請求中能夠同時存在多個Interceptor。每一個Interceptor 的調用會依據它的聲明順序依次執行,並且最早執行的都是Interceptor 中的preHandle 方法,因此能夠在這個方法中進行一些前置初始化操做或者是對當前請求的一個預處理,也能夠在這個方法中進行一些判斷來決定請求是否要繼續進行下去。該方法的返回值是布爾值Boolean類型的,當它返回爲false時,表示請求結束,後續的Interceptor和Controller都不會再執行;當返回值爲true時就會繼續調用下一個Interceptor的preHandle方法,若是已是最後一個Interceptor的時候就會是調用當前請求的Controller方法。url
(2)postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法,由preHandle 方法的解釋咱們知道這個方法包括後面要說到的afterCompletion方法都只能是在當前所屬的Interceptor的preHandle方法的返回值爲true時才能被調用。postHandle方法,顧名思義就是在當前請求進行處理以後,也就是Controller方法調用以後執行,可是它會在DispatcherServlet進行視圖返回渲染以前被調用,因此咱們能夠在這個方法中對Controller處理以後的ModelAndView對象進行操做。postHandle方法被調用的方向跟preHandle是相反的,也就是說先聲明的Interceptor的postHandle方法反而會後執行。
(3)afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法,該方法也是須要當前對應的Interceptor 的preHandle 方法的返回值爲true 時纔會執行。顧名思義,該方法將在整個請求結束以後,也就是在DispatcherServlet 渲染了對應的視圖以後執行。這個方法的主要做用是用於進行資源清理工做的。
執行的順序以下:
須要注意的點就是當preHandler爲true的時候,postHandler才能執行。當爲false的時候,afterCompletion仍然會執行。
一、filter接口在javax.servlet包下面。inteceptor定義在org.springframework.web.servlet中。 二、filter是servlet規定的,interceptor便可用於web程序,也可用於application中。 三、filter是servlet容器支持的,interceptor是spring框架支持的。 四、filter經過dochain放行,interceptor經過prehandler放行。 五、filter只在方法先後執行,interceptor粒度更細,能夠深刻到方法先後,異常拋出先後。