Spring拦截器原理

拦截器比如web开发中的利器,它能帮咱们进行统一的日志管理、权限的拦截等等。web

应用场景spring

一、日志记录,能够记录请求信息的日志,以便进行信息监控、信息统计等。数据库

二、权限检查:如登录检测,进入处理器检测是否登录,若是没有直接返回到登录页面。设计模式

三、性能监控:典型的是慢日志。mvc

HandlerInterceptorapp

史上最经典的SpringMVC拦截器原理讲解

拦截器适配器HandlerInterceptorAdapterpost

有时候咱们可能只须要实现三个回调方法中的某一个,若是实现HandlerInterceptor接口的话,三个方法必须实现,无论你需不须要,此时spring提供了一个HandlerInterceptorAdapter适配器(种适配器设计模式的实现),容许咱们只实现须要的回调方法。性能

史上最经典的SpringMVC拦截器原理讲解

这样在咱们业务中好比要记录系统日志,日志确定是在afterCompletion以后记录的,不然中途失败了,也记录了,那就扯淡了。必定是程序正常跑完后,咱们记录下那些对数据库作个增删改的操做日志进数据库。因此咱们只须要继承HandlerInterceptorAdapter,并重写afterCompletion一个方法便可,由于preHandle默认是true。设计

运行流程图3d

史上最经典的SpringMVC拦截器原理讲解

运行流程总结以下:

一、拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。

二、会先按照顺序执行全部拦截器的preHandle方法,一直遇到return false为止,好比第二个preHandle方法是return false,则第三个以及之后全部拦截器都不会执行。若都是return true,则按顺序加载完preHandle方法。

三、而后执行主方法(本身的controller接口),若中间抛出异常,则跟return false效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。

四、在主方法执行完业务逻辑(页面还未渲染数据)时,按倒序执行postHandle方法。若第三个拦截器的preHandle方法return false,则会执行第二个和第一个的postHandle方法和afterCompletion(postHandle都执行完才会执行这个,也就是页面渲染完数据后,执行after进行清理工做)方法。(postHandle和afterCompletion都是倒序执行)

正常流程Demo

史上最经典的SpringMVC拦截器原理讲解

史上最经典的SpringMVC拦截器原理讲解

史上最经典的SpringMVC拦截器原理讲解

史上最经典的SpringMVC拦截器原理讲解

<mvc:mapping path="/**"/>须要拦截的路径,这里匹配全部。这里的配置顺序将是拦截器执行顺序。

输出结果:

史上最经典的SpringMVC拦截器原理讲解

post和after是倒序的!!!!

中断流程Demo

将SyslogInterceptor3的preHandle方法返回false。其余不变,再看输出结果

史上最经典的SpringMVC拦截器原理讲解

发现没有了post,post方法一个都没有输出。不只如此,你的主程序代码(xxx.controller的一个接口)都不会被执行,因此只要遇到return false,则直接进行after清理工做,post和本身主程序代码都将被略过。

相关文章
相关标签/搜索