struts2核心功能都是基于struts2拦截器的,而拦截器又是基于java的动态代理。html
要实现struts2拦截器,需在struts.xml中配置拦截器,每一个action能够指定拦截器,指定了拦截器以后默认的拦截器链就失效了,须要从新显示指定拦截器链java
拦截器(interceptor)是Struts2最强大的特性之一,也能够说是struts2的核心,拦截器可让你在Action和result被执行以前或以后进行一些处理。同时,拦截器也可让你将通用的代码模块化并做为可重用的类。Struts2中的不少特性都是由拦截器来完成的。拦截是AOP(Aspect Objected Programing:面向切面编程)的一种实现策略。在Webwork的中文文档的解释为:拦截器是动态拦截Action调用的对象。它提供了一种机制可使开发者能够定义在一个action执行的先后执行的代码,也能够在一个action执行前阻止其执行。同时也是提供了一种能够提取action中可重用的部分的方式。谈到拦截器,还有一个词你们应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按必定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其以前定义的顺序被调用。编程
一.拦截器的实现原理:模块化
大部分时候,拦截器方法都是经过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,而后串成一个列表(list),最后一个一个地调用列表中的拦截器。事实上,咱们之因此可以如此灵活地使用拦截器,彻底归功于“动态代理”的使用。动态代理是代理对象根据客户的需求作出不一样的处理。对于客户来讲,只要知道一个代理对象就好了。那Struts2中,拦截器是如何经过动态代理被调用的呢?当Action请求到来的时候,会由系统的代理生成一个Action的代理对象,由这个代理对象调用Action的execute()或指定的方法,并在struts.xml中查找与该Action对应的拦截器。若是有对应的拦截器,就在Action的方法执行前(后)调用这些拦截器;若是没有对应的拦截器则执行Action的方法。其中系统对于拦截器的调用,是经过ActionInvocation来实现的。spa
参考:struts2拦截器的实现原理及源码剖析代理