过滤器(Filter)与拦截器(Interceptor)

过滤器(Filter)与拦截器(Interceptor)

两者的区别和联系

过滤器(Filter)

  • 依赖于servlet容器;
  • 在实现上基于函数回调,可以对几乎所有请求进行过滤;
  • 缺点:一个过滤器实例只能在容器初始化时调用一次;
  • 使用目的:主要做一些过滤操作,获取我们想要的数据,例如:
    • 过滤器中修改字符编码;
    • 过滤器中修改HttpServletRequest的一些参数,过滤低俗文字、危险字符等;

拦截器(Interceptor)

  • 依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架;
  • 实现上基于Java的反射机制,属于面向切面编程的一种运用;
  • 因为基于web框架,所以可以使用spring的依赖注入进行一些业务操作;
  • 一个拦截器实例可以在一个controller的生命周期之内多次调用;
  • 缺点:只能对controller请求进行拦截,其他的例如直接访问静态资源的请求则没法进行拦截;

两者对比

1.使用范围

  • Filter是Servlet中定义的,所以只能用于Web程序中;
  • Interceptor是Spring定义的,既可以用于web程序中,也可以用于其他程序中(Application、Swing);

2.依赖

  • Filter是Servlet中定义的,需要依赖Servlet容器的支持;
  • Interceptor是Spring中定义的,只需要Spring框架的支持即可;

3.使用的资源不同

  • Filter只能配置在web.xml中,无法获得更多的Spring的支持;
  • Interceptor是Spring中的一个组件,配置在Spring的上下文中,能与Spring里的任何资源、对象(Service层、数据源、事务管理等)通过IOC注入到拦截器中,能与Spring其他组件完美结合;

4.使用的深度不同

  • Filter只能在Servlet前后起作用,即chain.doFilter(request,response)方法调用的前后;
  • Interceptor能深入方法的前后(preHandle、postHandle)、异常抛出前后等,因此拦截器具有更大的弹性;

5.初始化

  • Filter在容器启动时执行init方法;
  • Interceptor没有初始化方法,只有在Controller方法调用前的preHandle方法;

你可能感兴趣的:(过滤器(Filter)与拦截器(Interceptor))