阿斯拉菲你好:
其实关于过滤器和拦截器的问题、博客、文章已经是非常多了但是还是有太多太多的同学搞不懂看不清琢磨不透它们。我总结的主要原因有两点第一就是用得少第二就是网络上的信息太过于琐碎且描述上太过于书本化实用性不强。我这里就使用大白话的方式来对这个问题进行解读。
首先需要知道过滤器和拦截器都是基于AOP编程思想的先理解一下AOP的概念AOP不是一种具体的技术而是一种编程思想。在面向对象编程的过程中我们很容易通过继承、多态来解决纵向扩展。 但是对于横向的功能比如在所有的service方法中开启事务或者统一记录日志等功能面向对象的是无法解决的。所以AOP——面向切面编程其实是面向对象编程思想的一个补充。
另外我们来说说它们最核心的区别区别其实说起来会有很多很多但是你只需要知道几个就足够了
1. Filter 是依赖于 Servlet 容器属于 Servlet 规范的一部分而拦截器则是独立存在的可以在任何情况下使用也就是说不是 SpringMVC 环境一样可以使用拦截器不过这种方式很少见到
2. Filter 的执行由 Servlet 容器回调完成而拦截器通常通过动态代理的方式来执行
3. 拦截器是基于Java的反射机制的而过滤器是基于函数回调
4. 过滤器不能对用户请求直接生成响应但是拦截器可以这一点非常重要可以写个 demo 试试
接下来我们来看看他们的调用顺序
filter -> interceptor -> ControllerAdvice -> controller
返回顺序正好是相反的
controller -> controllerAdvice -> Interceptor -> Filter
所以由此你也就知道了过滤器和拦截器虽然执行的时机不一样但是它们都处于 Controller 之前执行也就是你的 Service 之前。那么对于你的应用功能来说基本上使用过滤器和拦截器都是可行的方案。
最后一句话总结下关于拦截器和过滤器吧
拦截器相比过滤器有更细粒度的控制依赖于 Spring 容器可以在请求之前或之后启动过滤器主要依赖于 Servlet过滤器能做的拦截器基本上都能做。
我是勤一致力于将这门课程的问答区打造为 Java 知识体系知识库Java 知识体系 BBS共同建造、维护这门课程我需要每一个你