1.默认情况下,如果为某个Action配置拦截器,则这个拦截器将拦截Action中的所有方法。但是有时候并不是想拦截Action中的所有方法,而是值需要拦截其中某一个,或者某几个方法,此时就需要使用拦截器的方法过滤特性了。
为了实现拦截器的方法过滤特性,Struts2提供了一个MethodFiledInterceptor抽象类。这个类重写了AbstractInterceptor类中的interceptor()方法,并且提供了doInteceptor(ActionInvocation invocation)抽象方法。
2,方法过滤参数
定义拦截器类
action
struts.xml
--访问地址
http://localhost:8080/Struts2_inteceptorMethod/method!login.action
可以看到拦截器没有拦截
http://localhost:8080/Struts2_inteceptorMethod/method.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
可以看到拦截器拦截了