过滤器和拦截器
过滤器和拦截器都是基于AOP思想实现的,用于处理某个统一的功能
1 过滤器和拦截器区别
- 出身不同:过滤器是Java Servlet规范中的一部分,由Web容器负责管理和调用。而拦截器是Spring框架中的一部分,由Spring容器负责管理和调用。
- 触发时机不同:过滤器在请求进入Servlet或JSP之前被调用,并且在请求处理完成后被调用。而拦截器在请求进入Spring MVC控制器之前被调用,并且在请求处理完成后被调用。
- 实现不同:过滤器基于Java的Filter接口实现,需要在web.xml配置文件中进行注册。而拦截器基于Spring的HandlerInterceptor接口实现,需要在Spring配置文件中进行注册。
- 支持的项目类型不同:过滤器可以用于任何Java Web项目,无论是基于Servlet还是基于Spring MVC的。而拦截器主要用于基于Spring MVC的项目。
- 使用场景不同:过滤器通常用于处理请求的全局过滤逻辑,例如身份验证、日志记录等。而拦截器通常用于实现业务逻辑的拦截,例如权限验证、事务管理等。
2 执行顺序
请求进入容器 > 进入过滤器 > 进入 Servlet > 进入拦截器 > 执行控制器(Controller)
过滤器会先执行,然后才会执行拦截器,最后才会进入真正的要调用的方法
3 具体实现
1 过滤器
过滤器是基于方法回调实现的,当我们要执行下一个过滤器或下一个流程时,需要调用 FilterChain 对象的 doFilter 方法进行回调执行
2 拦截器
拦截器是基于动态代理(底层是反射)实现的
4 业务支持
1 过滤器
过滤器是 Servlet 规范中定义的,所以过滤器要依赖 Servlet 容器,它只能用在 Web 项目中
过滤器通常是用来实现通用功能过滤的,比如:敏感词过滤、字符集编码设置、响应数据压缩等功能
2 拦截器
拦截器是 Spring 中的一个组件,因此拦截器既可以用在 Web 项目中,同时还可以用在 Application 或 Swing 程序中。
拦截器主要用来实现项目中的业务判断的,比如:登录判断、权限判断、日志记录、异常处理