拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问以前,进行拦截而后在以前或以后加入某些操做。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可使开发者能够定义在一个Action执行的先后执行的代码,也能够在一个Action执行前阻止其执行。同时也是提供了一种能够提取Action中可重用的部分的方式。
谈到拦截器,还有一个词你们应该知道——拦截器链(Interceptor Chain,在Struts2中称为拦截器栈,Interceptor Stack)。拦截器链就是将拦截器按必定的顺序链接成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其以前定义的顺序被调用。
下面是我对于拦截器概念的理解。
咱们知道在Struts2框架里面有不少的拦截器,在拦截器里面帮咱们实现了一部分功能。但在Strtus2框架里面的不少的拦截器,并非都执行,每次只会执行一些默认的拦截器,那这些拦截器是在哪儿呢?Strtus2框架里面默认拦截器位置的是在struts2-core-2.3.24.jar包下的struts-default.xml文件中,在该文件中,咱们可找到默认拦截器的配置:html
<interceptor-stack name="defaultStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="i18n"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <interceptor-ref name="scopedModelDriven"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="datetime"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="debugging"/> <interceptor-ref name="deprecation"/> </interceptor-stack>
问题来了,拦截器是在何时执行的呢?在Action对象建立以后,在Action里面的方法执行以前执行拦截器。编程
大部分时候,拦截器方法都是经过代理的方式来调用的。Struts2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,而后串成一个列表,最后一个一个地调用列表中的拦截器。
Struts2的拦截器是可插拔的,拦截器是AOP的一种实现。Struts2拦截器栈就是将拦截器按必定的顺序链接成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其以前定义的顺序被调用。
关于对拦截器的底层实现原理,个人理解是——拦截器的底层实现原理主要有两部分:设计模式
拦截器的执行流程可参考官网提供的图,以下:
看上面的图,仍是比较空洞,因此我仍是作一点点解释。要理解拦截器的执行流程,须理解下面这3点:app
过滤器理论上能够过滤任意内容,如过滤jsp、过滤html、过滤图片(路径)、过滤servlet等。而拦截器是能够拦截内容,但拦截器只能拦截action。框架