1. 程式人生 > >SpringMVC中Interceptor和Filter區別

SpringMVC中Interceptor和Filter區別

通過 onf ron err mvc 無法 處理 上下 pin

Interceptor

主要作用:攔截用戶請求,進行處理,比如判斷用戶登錄情況,權限驗證,主要針對Action請求進行處理。是通過HandlerInterceptor 實現的。

配置如下:

  <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實現。代碼如下:

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進行視圖的渲染之前

執行,因此可以對ModelAndView 對象進行處理;afterCompletion方法是在DispatcherServlet進行視圖的渲染之後執行調用,主要是進行一些資源清理等工作。

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

Filter

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

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

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

一般過濾器可通過實現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");
    }

}

攔截器和過濾器執行順序:
1、Filter.init();
2、Filter.doFilter(); before doFilter
3、HandlerInterceptor.preHandle();
4、Controller方法執行
5、HandlerInterceptor.postHandle();
6、DispatcherServlet視圖渲染
7、HandlerInterceptor.afterCompletion();
8、Filter.doFilter(); after doFilter
9、Filter.destroy();

Filter和Interceptor的區別

  • Filter是基於函數回調(doFilter()方法)的,而Interceptor則是基於Java反射的(AOP思想)。
  • Filter依賴於Servlet容器,而Interceptor不依賴於Servlet容器。
  • Filter對幾乎所有的請求起作用,而Interceptor只能對action請求起作用。
  • Interceptor可以訪問Action的上下文,值棧裏的對象,而Filter不能。
  • 在action的生命周期裏,Interceptor可以被多次調用,而Filter只能在容器初始化時調用一次。

SpringMVC中Interceptor和Filter區別