前言
过滤器和拦截器在Java Web应用程序中,都用于请求处理过程中执行特定的操作。
1、过滤器
(1)作用
过滤器执行是在Servlet之前。客户端发送请求,先经过Filter,再到达目标Servlet;响应时,再根据执行流程反向执行Filter。一般用于通用的操作,例如登录验证、统一编码处理、敏感字符过滤等。
(2)生命周期
Filter接口:
-
init():该方法在容器启动初始化过滤器时被调用,它在Filter整个生命周期中只会被调用一次。这个方法必须执行成功,否则过滤器不会起作用。
-
doFilter():容器中的每一次请求都会调用该方法。
-
destroy():当容器销毁过滤器实例时调用,一般在该方法中销毁或关闭资源,在整个Filter的生命周期中也只会被调用一次。
过滤器的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)的入参是ServletRequest ,而不是HttpServletRequest,它可以完成任何协议的过滤操作。
2、拦截器
(1)作用
拦截器采用AOP的设计思想,用来拦截在处理方法之前和之后执行的一些功能。例如权限控制、性能监控、事物管理等。
拦截器可以获取IOC容器中的各个Bean,在拦截器中注入一个Service,可以调用业务逻辑。
(2)生命周期
HandlerInterceptor接口:
- preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) :这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false ,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。
- postHandle(HttpServletRequest request, HttpServletResponse response, Object handler):只有在 preHandle() 方法返回值为true 时才会执行。会在Controller 中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。 此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
- afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler):只有在 preHandle() 方法返回值为true 时才会执行。在整个请求结束之后, DispatcherServlet 渲染了对应的视图之后执行。如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于trycatchfinally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器才会执行。
补充:
多个拦截器的执行顺序
1、若每个拦截器的preHandle()都返回true
此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:preHandle()会按照配置的顺序执行,而postHandle()和afterCompletion()会按照配置的反序执行。2、若某个拦截器的preHandle()返回了false
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterCompletion()会执行。
3、区别
1、过滤器依赖于Servlet容器,而拦截器依赖SpringMVC;
2、过滤器是JavaEE标准,采用函数回调的方式,而拦截器是基于Java反射;
在我们自定义的过滤器中都会实现一个 doFilter()方法,这个方法有一个FilterChain 参数,而实际上它是一个回调接口。ApplicationFilterChain是它的实现类, 这个实现类内部也有一个 doFilter() 方法就是回调方法。
3、过滤器几乎对所有的请求都可以起作用,而拦截器只能对SpringMVC请求起作用;
4、拦截器可以访问处理方法的上下文,而过滤器不可以;
5、触发时机不同,过滤器是在请求进入容器后,但在进入servlet之前进行预处理,在请求结束返回之前进行后处理,而拦截器是在请求进入servlet之后,进入Controller之前进行预处理,Controller中渲染了对应的试图后请求结束。
4、总结
过滤器:从一堆东西中筛选出符合要求的,例如过滤敏感信息;
拦截器:干预到一个请求当中,不符合可以直接终止,例如鉴权,qos设置。
内容参考:
https://zhuanlan.zhihu.com/p/484289805
https://blog.csdn.net/w_l666/article/details/131703341