1. 实现原理不同
- 过滤器和拦截器底层实现不同。过滤器是基于函数回调的,一般自定义的过滤器中都会实现一个doFilter()方法,这个方法有一个FilterChain参数,而实际上它是一个回调接口。
- 拦截器是基于Java的反射机制(动态代理)实现的。
2. 触发时机不同
- 过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
- 拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
3. 使用的场景不同
因为拦截器更接近业务系统,所以拦截器主要用来实现项目中的业务判断的,比如:日志记录、权限判断等业务。
而过滤器通常是用来实现通用功能过滤的,比如:敏感词过滤、响应数据压缩等功能。
4. 拦截的请求范围不同
请求的执行顺序是:请求进入容器 -> 进入过滤器 -> 进入 Servlet -> 进入拦截器 -> 执行控制器。
可以看到过滤器和拦截器的执行时机也是不同的,过滤器会先执行,然后才会执行拦截器,最后才会进入真正的要调用的方法。