拦截器是基于AOP思想的,它是针对aciton的拦截,与filter不同,filter是针对请求与响应的。不过两者的行为类似。
1. Struts2自定义拦截器需要实现的接口或类的关系
自定义拦截器步骤
1. 直接或间接实现接口Interceptor
2. 在struts.xml中定义自定义的拦截器
3. 在struts.xml中的action中,引用拦截器
2. 自定义拦截器简易示例
public class TestInterceptor extends MethodFilterInterceptor(){
@override
public String doIntercept(ActionInvocation invocation) thorws Exception{
String resultString="error";
system.out.print("aciton执行前的处理");
if("成立"){
resultString = invocation.invoke();
}
system.out.print("aciton执行后的处理");
return resultString;
}
说明:
1.由于Struts2的拦截器执行是类似于递归方法执行,所以,在执行到action前,拦截器都是执行前处理,执行action返回后,拦截器就执行后处理。
2.拦截器要放行,则执行invocation.invoke(), 会继续执行下一个拦截器,不放行则直接返回一个明确的字符串,字符串就是result对应的name
3. 特别地,如果可以执行到action,后续的result就是由action决定的,不会再受拦截器返回值的影响。如果不可以执行到action,那么中途拦截器有什么返回值,则决定最终去向。
3. struts.xml配置拦截器
拦截器配置两个步骤:
1. 通过<intercept>元素定义拦截器
2. 通过<interceptor-ref>引用拦截器
建议:自定义拦截器放在默认拦截器之前。
注意:自定义拦截器之后,仍需引用默认拦截器栈。虽然继承了struts-default,struts-default.xml里有默认拦截器defaultStack,但是,这只是说在没有自定义拦截器的时候会默认使用继承的默认拦截器栈,但在有自定义拦截器后,就不生效了,需要自己引用。不引用的话,基于拦截器的Struts2会报错(不排除你自己选用合适的拦截器,但是对于初学者是不适合的)。
<package name="login" namespace="/" extends="struts-default">
<!--定义拦截器,拦截器与拦截器栈的定义是类似,只是标签不同-->
<interceptors>
<!--定义自定义拦截器-->
<interceptor name="XXX" class="XXX"/>
<!--定义拦截器栈-->
<interceptor-stack name="XXX">
<interceptor-ref name="XXX"/>
<interceptor-ref name="XXX"/>
</interceptor-stack>
</interceptors>
<!--在struts-default.xml中,引用了默认的defaultStack,所以继承这个包的package,都会有一个默认拦截器栈-->
<!--一个包中,只允许存在一个默认拦截器(栈),引用的时候,都引用名字就可以了-->
<!--如果自己定义了默认拦截器,记得要在设定的拦截器栈里应用defaultStack拦截器栈,不然那20个拦截器是没指定使用的-->
<default-interceptor-ref name="XXX"/>
<!--定义action-->
<action name="loginAction" class="XXX">
<!--结果映射-->
<result name="success>success.jsp</result>
<result name="error">error.jsp</result>
<!--引用拦截器-->
<!--defaultStack是默认的拦截器栈,可以到struts-default里查看-->
<interceptor-ref name="defaultStack/>
<!--引用拦截器,用MethodsFilterInterceptor方法才可以设置方法的拦截名单(黑名单)/放行名单(白名单)-->
<interceptor-ref name="loginInterceptor>
<param name="includeMethods">方法名1,方法名2</param>
<param name="excludeMethods">方法名1,方法名2</param>
</interceptor-ref>
</action>
</package>