- 拦截器的方法过滤
默认情况下,如果为某个Action配置拦截器,则这个拦截器将拦截Action中的所有方法。因此想实现拦截器的方法过滤应该继承MethodFileInterceptor抽象类,重写其doIntercept()方法。
需要使用的两个参数:
excludeMethods
参数指定拦截器拒接拦截器拦截的方法列表。如果有多个方法,则每两个方法用“,”隔开。如:login,register.拦截器将不会拦截login()和register()方法。
includeMethods
参数指定拦截器需要拦截器拦截的方法列表。如果有多个方法,则每两个方法用“,”隔开。如:login,register.拦截器将会拦截login()和register()方法。
1.拦截器类MethodInterceptor.java配置
package interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MethodInterceptor extends MethodFilterInterceptor{
/**
*
*/
private static final long serialVersionUID = 456618038854682063L;
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("拦截器起作用了");
//invoke()继续执行下一步操作。
return invocation.invoke();
}
}
2.action类配置MethodAction.java
package action;
import com.opensymphony.xwork2.ActionSupport;
public class MethodAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = -6421309871527198245L;
@Override
public String execute(){
System.out.println("execute()方法执行");
return SUCCESS;
}
public String login(){
System.out.println("login()方法执行");
return SUCCESS;
}
public String register(){
System.out.println("register()方法执行");
return SUCCESS;
}
}
3.struts.xml配置
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="gb2312" />
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="methodInterceptor" class="interceptor.MethodInterceptor" />
</interceptors>
<action name="method" class="action.MethodAction" method="login"> <!-- 配置Action -->
<result name="success">/success.jsp</result>
<result name="login">/login.jsp</result>
<interceptor-ref name="methodInterceptor">
<param name="excludeMethods">execute</param>
</interceptor-ref>
<!-- <interceptor-ref name="methodInterceptor"> <param name="excludeMethods">login,register</param>
</interceptor-ref> -->
<!-- <interceptor-ref name="methodInterceptor"> <param name="includeMethods">login</param>
<param name="excludeMethods">execute</param> </interceptor-ref> -->
<interceptor-ref name="defaultStack" /> <!-- 引用系统默认拦截器 -->
</action>
</package>
</struts>
- 拦截器执行顺序
execute()方法执行之前,配置在前面的拦截器会先对用户起作用,execute()方法执行之后,配置在后的拦截器会先对用户起作用。
- 拦截结果监听器
实现拦截结果的监听器,只需要实现PreresultListener接口。
注:在拦截器结果监听器的方法beforeResult()中,也可以获得ActionInvocation实例,但是千万不能通过此实例再次调用invoke()方法,如果再次调用,将会再次进入Action处理,Action处理之后再执行beforeResult()fangfa,这样会进入死循环。