SpringBoot使用过滤器、拦截器、切面及其之间的区别和执行顺序

点击关注公众号,实用技术文章及时了解SpringBoot使用过滤器、拦截器、切面及其之间的区别和执行顺序


先上代码,下面的demo中包含多个拦截器、过滤器,以及切面的前置通知/后置通知/环绕通知:

https://gitee.com/xiaorenwu_dashije/filter_interceptor

SpringBoot使用过滤器、拦截器、切面及其之间的区别和执行顺序

相关原理:

首先了解一下SpringMVC的执行流程

SpringBoot使用过滤器、拦截器、切面及其之间的区别和执行顺序

具体流程如下:

  • 用户发起请求到前端控制器(Controller)

  • 前端控制器没有处理业务逻辑的能力,需要找到具体的模型对象处理(Handler),到处理器映射器(HandlerMapping)中查找Handler对象(Model)。

  • HandlerMapping返回执行链,包含了2部分内容:① Handler对象、② 拦截器数组

  • 前端处理器通过处理器适配器包装后执行Handler对象。

  • 处理业务逻辑。

  • Handler处理完业务逻辑,返回ModelAndView对象,其中view是视图名称,不是真正的视图对象。

  • 将ModelAndView返回给前端控制器。

  • 视图解析器(ViewResolver)返回真正的视图对象(View)。

  • (此时前端控制器中既有视图又有Model对象数据)前端控制器根据模型数据和视图对象,进行视图渲染。

  • 返回渲染后的视图(html/json/xml)返回。

  • 给用户产生响应。

核心就是DispatcherServlet核心控制器,我们看源码可知道DispatcherServlet是Servlet的子类

SpringBoot使用过滤器、拦截器、切面及其之间的区别和执行顺序

下面用一张图说一下过滤器、Servlet容器、拦截器、AOP、Controller之间的关系

SpringBoot使用过滤器、拦截器、切面及其之间的区别和执行顺序

然后具体执行流程如下:

SpringBoot使用过滤器、拦截器、切面及其之间的区别和执行顺序

拦截器和过滤器的区别

1、拦截器不依赖与servlet容器是SpringMVC自带的,过滤器依赖于Servlet容器。

2、拦截器是基于Java的反射机制的,而过滤器是基于函数回调。

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4、拦截器可以访问controller上下文、值栈里的对象,而过滤器不能访问。

拦截器的preHandle方法在进入controller前执行,而拦截器的postHandle方法在执行完controller业务流程后,在视图解析器解析ModelAndView之前执行,可以操控Controller的ModelAndView内容。而afterCompletion是在视图解析器解析渲染ModelAndView完成之后执行的

过滤器是在服务器启动时就会创建的,只会创建一个实例,常驻内存,也就是说服务器一启动就会执行Filter的init(FilterConfig config)方法.当Filter被移除或服务器正常关闭时,会执行destroy方法

5、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

关于这句话的解读是:我们知道拦截器是SprinMVC自带的,而SpringMVC存在Controller层的,而controller层可以访问到service层,service层是不能访问service层的,而过滤器是客户端和服务端之间请求与响应的过滤

6、过滤器和拦截器触发时机、时间、地方不一样

过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是在servlet处理完后,返回给前端之前,如果看不懂可以看7完后再来理解

7、过滤器包裹住servlet,servlet包裹住拦截器。

来源:cnblogs.com/java-spring/p/12742984.html

推荐

Java面试题宝典

技术内卷群,一起来学习!!

SpringBoot使用过滤器、拦截器、切面及其之间的区别和执行顺序

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。“在看”支持我们吧!

原文始发于微信公众号(Java知音):SpringBoot使用过滤器、拦截器、切面及其之间的区别和执行顺序

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/60071.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!