# filter_interceptor **Repository Path**: terrell-tan/filter_interceptor ## Basic Information - **Project Name**: filter_interceptor - **Description**: 主要用来测试过滤器、拦截器、切面的执行顺序以及执行时机 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 14 - **Created**: 2022-12-14 - **Last Updated**: 2022-12-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # filter_interceptor #### 介绍 主要用来测试过滤器、拦截器、切面的执行顺序以及执行时机 #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) SpringBoot使用过滤器、拦截器、切面(AOP),及其之间的区别和执行顺序 先上代码,下面的demo中包含多个拦截器、过滤器,以及切面的前置通知/后置通知/环绕通知: https://gitee.com/xiaorenwu_dashije/filter_interceptor.git ![输入图片说明](https://foruda.gitee.com/images/1670999780065768595/1ff8d8e2_8302029.png "1.png") 下面总结一下相关原理: 首先了解一下SpringMVC的执行流程 ![输入图片说明](https://foruda.gitee.com/images/1670999816862222054/6364a936_8302029.png "2.png") 具体流程如下 用户发起请求到前端控制器(Controller) 前端控制器没有处理业务逻辑的能力,需要找到具体的模型对象处理(Handler),到处理器映射器(HandlerMapping)中查找Handler对象(Model)。 HandlerMapping返回执行链,包含了2部分内容: ① Handler对象、② 拦截器数组 前端处理器通过处理器适配器包装后执行Handler对象。 处理业务逻辑。 Handler处理完业务逻辑,返回ModelAndView对象,其中view是视图名称,不是真正的视图对象。 将ModelAndView返回给前端控制器。 视图解析器(ViewResolver)返回真正的视图对象(View)。 (此时前端控制器中既有视图又有Model对象数据)前端控制器根据模型数据和视图对象,进行视图渲染。 返回渲染后的视图(html/json/xml)返回。 给用户产生响应。 核心就是DispatcherServlet核心控制器,我们看源码可知道DispatcherServlet是Servlet的子类 ![输入图片说明](https://foruda.gitee.com/images/1670999914843283988/cd7c59a4_8302029.png "3.png") 下面用一张图说一下过滤器、Servlet容器、拦截器、AOP、Controller之间的关系 ![输入图片说明](https://foruda.gitee.com/images/1670999926885341505/20f3bfdd_8302029.png "4.png") 然后具体执行流程如下: ![输入图片说明](https://foruda.gitee.com/images/1670999941602674064/811fcf39_8302029.png "5.png") 拦截器和过滤器的区别 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包裹住拦截器。 劈天造陆,开辟属于自己的天地!!!与君共勉