struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default.xml文件中,name为拦截器的名字,至关于该拦截器的惟一标识。class指定了该拦截器的实现类。在package中继承了Struts2的默认struts-default包,则能够自由使用这些内建拦截器。java
1)alias:实如今不一样请求中类似参数别名的转换;spring
2)autowiring:自动装配的拦截器,用于与spring整合;session
3)chain:构建一个Action链,使当前Action能够访问前一个Action的属性;app
4)conversionError:负责处理类型转换错误的拦截器,负责将类型转换错误从ActionContext中取出,并转换成Action的FieldError错误;ide
5)createSession:负责建立一个HttpSession对象。this
6)debugging:当使用Struts2的开发模式,该拦截器提供更多的提示信息;spa
7)execAndWait:后台执行Action,负责将等待画面发送给用户。debug
8)exception:负责处理异常,它将异常映射为结果。日志
9)fileUpload:负责文件上传,解析表单中文件域的内容。code
10)i18n:支持国际化的拦截器,把所选的语言、区域放入用户Session中;
11)model-driven:用于模型驱动的拦截器,当某个Action类实现了ModelDrien接口时,它负责把getModel()方法的结果放入堆ValueStack中;
12)logger:负责日志记录的拦截器,主要输出Action的名字;
13)scoped-model-driven:若是一个Action实现了一个ScopedModelDriven接口,该拦截器负责从指定范围中找到指定的Model,并经过setModel方法将该Model传给Action实列;
14)params:负责解析Http请求中的参数,并将参数值设置为Action中的参数;
15)prepare:若是Action实现了Preparable接口,将会调用该拦截器的prepare()方法;
16)static-params:将xml中action标签下的<param>标签中的参数传入action。
17)scope:范围转换拦截器,它能够将Action状态信息保存到HttpSession范围内,或者保存到ServletContext范围;
18)servlet-config:若是某个Action须要直接访问Servlet API ,就是经过这个拦截器实现。
19)roles:只有当浏览者取得适合的受权后,才能够调用被该拦截器拦截的Action;
20)timer:负责输出执行Action的执行时间;
21)token:用于阻止重复提交,
22)token-session:负责把token保存至HttpSession中;
23)validation:经过执行在xxxAction-validation.xml中定义的校验器从而完成数据校验;
24)workflow:负责调用Action类中的validate方法,若是校验失败则返回input试图;
<!-- 配置拦截器 --> <interceptor name="拦截器名称" class="拦截器实现类"></interceptor>
除了以上配置外还能够将多个拦截器合在一块儿配置拦截栈
<interceptor-stack name="loggerStack"> <!--使用内置拦截器--> <interceptor-ref name="logger" /> <interceptor-ref name="debugging" /> </interceptor-stack>
在一个拦截器中能够配置多个拦截器,也能够引用其余的拦截栈
当Action中没有声明使用拦截器时,该Action所在包的默认拦截器才会生效。每一个package只能配置一个默认拦截器。
<default-interceptor-ref name="默认拦截器" />
1)继承com.opensymphony.xwork2.ActionInvocation抽象类,重写intercept(ActionInvocation arg0)方法。
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import com.shcredit.controller.appkind.AddAppKindInfoAction; public class SimpleInterceptor extends AbstractInterceptor { //拦截器的名称 private String name; public void setName(String name) { this.name = name; } @Override public String intercept(ActionInvocation arg0) throws Exception { System.out.println("进入"+name+"拦截器。。。。。。。"); //取得被拦截的Action实列 AddAppKindInfoAction action = (AddAppKindInfoAction)arg0.getAction(); //若是该拦截器后没有其余拦截器,则执行AddAppKindInfoAction中的execute方法 String result = arg0.invoke(); return result; } }
2)xml文件中,在须要使用该拦截器的package中配置该拦截器,而后在action中引入该拦截器便可。
<interceptors> <!-- 为拦截器指定参数值 --> <interceptor name="simple" class="com.shcredit.controller.interceptor.SimpleInterceptor"> <param name="name">mySimple</param> </interceptor> </interceptors>
<action name="add" class="com.shcredit.controller.appkind.AddAppKindInfoAction"> <!-- 使用Simple拦截器 --> <interceptor-ref name="simple"> </interceptor-ref> </action>
在默认状况下,若是咱们为某个Action定义了拦截器,该拦截器就会拦截action中的全部方法,在一些状况下咱们须要拦截一些特定的方法,就可使用到方法拦截器进行拦截。
1)实现com.opensymphony.xwork2.interceptor.MethodFilterInterceptor类,重写其doIntercept(ActionInvocation action)回调方法。
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; import com.shcredit.controller.appkind.AddAppKindInfoAction; import com.shcredit.vo.info.AppKindInfoVO; public class MyfliterIntercept extends MethodFilterInterceptor { private String name;//拦截器的名字 public void setName(String name) { this.name = name; } /* 拦截方法的拦截器,继承MethodFilterInterceptor * @see com.opensymphony.xwork2.interceptor.MethodFilterInterceptor#doIntercept(com.opensymphony.xwork2.ActionInvocation) */ @Override protected String doIntercept(ActionInvocation action) throws Exception { AddAppKindInfoAction appKindAction = (AddAppKindInfoAction)action.getAction(); System.out.println("进入appKindAction拦截器。。。。。。"); AppKindInfoVO appKind = appKindAction.getAppKind(); String invoke = action.invoke(); return invoke; } }
2)在xml中对方法拦截器的配置和以前的同样,须要注意的是它能够选择配置拦截方法
<interceptor-ref name="myfilter"> <!--从新定义name属性的属性值--> <param name="name">更名后的拦截方法过滤器</param> <!--指明须要被拦截的方法--> <param name="includeMethods">execute,testFliter,setAppKind</param> <!--指明不被拦截的方法--> <param name="excludeMethods">testNoFliter</param> </interceptor-ref>
在Action中的execute执行以后,返回试图以前可使用PreResultListener进行监听,在拦截器中使用该监听器,只要该拦截器被触发,该监听也将会被触发。
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.PreResultListener; public class MyPreResultListener implements PreResultListener { @Override public void beforeResult(ActionInvocation arg0, String arg1) { System.out.println("进入beforeResult"); //会致使死循环,进入action中的execute方法后进入该拦截器,又进入execute... //arg0.invoke(); System.out.println("返回的逻辑试图名:"+arg1); } }
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class BeforeResultInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation arg0) throws Exception { //为该拦截器添加MyPreResultListener监听器 arg0.addPreResultListener(new MyPreResultListener()); System.out.println("执行execute方法以前的拦截"); String invoke = arg0.invoke(); System.out.println("execute方法执行以后的拦截"); return invoke; } }
将BeforeResultInterceptor拦截器配置在xml中,便可。
注意:不要在MyPreResultListener中调用invoke(),会致使死循环。