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只能在容器初始化时调用一次。
相关文章
相关标签/搜索