在默认情况下,Struts2拦截器会拦截Action中所有的方法。但有的时候,我们只需要拦截其中的一些方法,就需要使用Struts2拦截器的方法过滤特性来解决这个问题。如何实现的话,只需要继承一些特定的Interceptor类,并在配置文件中进行配置即可。以MethodFilterInterceptor为例,重写doIntercept方法后,还在配置文件中指定相应的方法名,演示代码如下
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class ExecuteTimeInterceptor extends MethodFilterInterceptor {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String doIntercept(ActionInvocation actionInvocation) throws Exception{
System.out.println(getName() + " 开始执行");
long start = System.currentTimeMillis();
String result = actionInvocation.invoke();
long end = System.currentTimeMillis();
System.out.println(getName() + " 执行Action方法的时间:" + (end-start) + "毫秒");
System.out.println(getName() + " 执行结束");
return result;
}
}
MethodFilterInterceptor拦截器可在配置文件中传递两个参数,excludeMethods和includeMethods,excludeMethods指定的方法不会被拦截,而includeMethods指定的方法会被拦截。当两个指向同一方法时,该方法仍会被拦截。演示代码如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="testActionContext" extends="struts-default">
<interceptors>
<interceptor name="executeTime" class="chapter9.ExecuteTimeInterceptor">
<param name="name">执行时间</param>
</interceptor>
<interceptor-stack name="customStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="executeTime"/>
</interceptor-stack>
</interceptors>
<global-results>
<result name="exception">/chapter8/exception.jsp </result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.sql.SQLException" result="exception"/>
</global-exception-mappings>
<action name="login" class="chapter8.LoginAction">
<interceptor-ref name="customStack">
<param name="executeTime.name">计算执行时间的拦截器</param>
<param name="executeTime.includeMethods">execute</param>
<param name="executeTime.excludeMethods">process</param>
</interceptor-ref>
<result name="success">/chapter8/success.jsp</result>
<result name="error">/chapter8/error.jsp</result>
</action>
</package>
</struts>
除了MethodFilterInterceptor可以指定过滤方法,继承以下类也可以
* ExecuteAndWaitInterceptor
* ParametersInterceptor
* PrepareInterceptor
* TokenInterceptor
* TokenSessionStoreInterceptor
* AnnotationValidationInterceptor
* DefaultWorkflowInterceptor