1.默认情况下,如果为某个Action配置拦截器,则这个拦截器将拦截Action中的所有方法。但是有时候并不是想拦截Action中的所有方法,而是值需要拦截其中某一个,或者某几个方法,此时就需要使用拦截器的方法过滤特性了。
为了实现拦截器的方法过滤特性,Struts2提供了一个MethodFiledInterceptor抽象类。这个类重写了AbstractInterceptor类中的interceptor()方法,并且提供了doInteceptor(ActionInvocation invocation)抽象方法。
2,方法过滤参数
excluedMethods:执行拦截器拒绝拦截的方法列表,如果有多个方法名之间使用英文“,”分割,例如指定该参数值为login,register 那么拦截器将不会拦截login()he register()方法。
includeMethods:指定拦截器需要拦截的方法,如果有多个方法,则用英文“,”分割。例如指定该参数值为 method1,method2,那么拦截器将拦截method1和method2方法();
定义拦截器类
package com.sh.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MethodInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("拦截器起作用了!");
return invocation.invoke();
}
}
action
package com.sh.action;
import com.opensymphony.xwork2.ActionSupport;
public class MethodAction extends ActionSupport{
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;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 修改请求的后缀名为.do 修改后每个请求必须要有后缀了-->
<constant name="struts.action.extension" value="do,action"/>
<!-- 对于 采用 "!方法名"这种方法有用 ,采用通配符就不需要设置这个了 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 默认的视图主题 <constant name="struts.ui.theme" value="simple"/>-->
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="methodInterceptor"
class="com.sh.interceptor.MethodInterceptor"/>
</interceptors>
<action name="method" class="com.sh.action.MethodAction">
<result>/success.jsp</result>
<result name="login">/login.jsp</result>
<interceptor-ref name="methodInterceptor">
<param name="excludeMethods">execute</param>
<!--<param name="includeMethods">execute</param> -->
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
</action>
</package>
</struts>
--访问地址
http://localhost:8080/Struts2_inteceptorMethod/method!login.action
可以看到拦截器没有拦截
http://localhost:8080/Struts2_inteceptorMethod/method.action
可以看到拦截器拦截了