SpringMVC中Interceptor和Filter區別

Interceptor

主要做用:攔截用戶請求,進行處理,好比判斷用戶登陸狀況,權限驗證,主要針對Action請求進行處理。是經過HandlerInterceptor 實現的。web

配置以下:mvc

  <mvc:interceptors>
        <bean class="cn.appsys.testInterceptor"></bean>//攔截全部請求
        <mvc:interceptor>
            <mvc:mapping path="/manager/backend/**"/>
            <bean class="cn.appsys.interceptor.SysInterceptor"/>//攔截上面請求
        </mvc:interceptor>
        
    </mvc:interceptors>

通常攔截器可經過實現HandlerInterceptor接口或者繼承HandlerInterceptorAdapter實現。代碼以下:app

public class TestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion");
    }
}
 

preHandle是在請求到達Controller以前實現,可進行用戶校驗登陸等操做,返回true後,請求到達Controller層;postHandle方法是在執行完Controller層代碼以後,DispatcherServlet進行視圖的渲染以前ide

執行,所以能夠對ModelAndView 對象進行處理;afterCompletion方法是在DispatcherServlet進行視圖的渲染以後執行調用,主要是進行一些資源清理等工做。函數

注:只能對Controller請求進行攔截,對一些靜態資源沒法攔截。post

 

Filterurl

主要做用:統一設置字符集等。spa

依賴於servlet容器,過濾器實例只在初始化的時候調用一次。code

過濾器在web.xml配置以下:xml

     <filter>
         <filter-name>testFilter</filter-name>
         <filter-class>cn.appsys.TestFilter</filter-class>
     </filter>
     <filter-mapping>
         <filter-name>testFilter</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>    

通常過濾器可經過實現Filter接口實現。代碼以下:

public class TestFilter implements Filter {

    @Override
    public void destroy() {
        System.out.println("filter destroy");
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        System.out.println("filter doFilter before");
        arg2.doFilter(arg0, arg1);
        System.out.println("filter doFilter after");

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("filter init");
    }

}

攔截器和過濾器執行順序:
一、Filter.init();
二、Filter.doFilter(); before doFilter
三、HandlerInterceptor.preHandle();
四、Controller方法執行
五、HandlerInterceptor.postHandle();
六、DispatcherServlet視圖渲染
七、HandlerInterceptor.afterCompletion();
八、Filter.doFilter(); after doFilter
九、Filter.destroy();

 

Filter和Interceptor的區別

  • Filter是基於函數回調(doFilter()方法)的,而Interceptor則是基於Java反射的(AOP思想)。
  • Filter依賴於Servlet容器,而Interceptor不依賴於Servlet容器。
  • Filter對幾乎全部的請求起做用,而Interceptor只能對action請求起做用。
  • Interceptor能夠訪問Action的上下文,值棧裏的對象,而Filter不能。
  • 在action的生命週期裏,Interceptor能夠被屢次調用,而Filter只能在容器初始化時調用一次。
相關文章
相關標籤/搜索