过滤器(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方法;