Struts2自定义拦截器(方法拦截器)
一、实现Interceptor接口
1 public interface Interceptor extends Serializable{ 2 public void init(); 3 public void destroy(); 4 public String intercept(ActionInvocation invocation)(); 5 }
并实现上述方法。
二、继承AbstractInterceptor类,重写intercept()方法即可
此方法更可行,其实AbstractInterceptor类也就是实现了Interceptor接口。
1. invocation.invoke();表示该方法执行完后执行Action的execute()方法或者执行下一个拦截器。
2. invocation.getAction(); 可以将该法强制转换为Action的类类型。
三、方法拦截器:继承MethodFilterInterceptor类,重写doIntercept()方法
MethodFilerInterceptor实现方法过滤中用到的两个参数。 execludeMethods:该参数指定拦截器拒绝拦截的方法列表,多个方法用“,”隔开(支持通配符*,例如add*,表示所有以add开头的方法),如果指定了这个参数拦截器不会拦截指定列表中的方法,就是所谓的黑名单。 includeMethods: 该参数指定拦截器需要拦截的方法列表,多个方法用“,”隔开(支持通配符*,例如add*,表示所有以add开头的方法),如果指定了参数,则指定的Action在执行前会被拦截,即白名单。
定义好自定义拦截器后,就要使用自定义拦截器,在struts.xml文档中。
一、包内定义拦截器
1 <package....> 2 <interceptors> 3 <interceptor name="myinterceptor" class="...."> 4 </interceptor> 5 </interceptors> 6 </package>
二、action内使用拦截器
1 <action .....> 2 <result.....></result> 3 <interceptor-ref name="defaultStack"></interceptor-ref> 4 <interceptor-ref name="myinterceptor"></interceptor-ref> 5 </action>
主要:可以看出使用了自定义拦截器的action要配置默认拦截器的引用,因为默认拦截器包含了参数的读取、session的管理等功能。
以下是例子:
1 public class MyMethodInterceptor extends MethodFilterInterceptor{ 2 protected String doIntercept(ActionInvocation invocation) throws Exception { 3 // TODO Auto-generated method stub 4 System.out.println("进入MyMethodInterceptor方法拦截器!!!!!!!!!!!!!"); 5 Map session = invocation.getInvocationContext().getSession(); 6 String name = (String) session.get("uname"); 7 if (name != null) { 8 return invocation.invoke(); 9 } 10 return "input"; 11 } 12 }
struts.xml配置
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 7 <constant name="struts.i18n.encoding" value="UTF-8"></constant> 8 <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> 9 <!-- <constant name="struts.action.extension" value="action,abc"></constant>--> 10 11 <package abstract="true" name="pk1" namespace="/" extends="struts-default"></package> 12 <package name="k2" extends="pk1"> 13 14 <interceptors> 15 <interceptor name="method1" class="org.interceptors.MyMethodInterceptor"> 16 <param name="excludeMethods">login</param> 17 </interceptor> 18 <!--定义拦截器栈--> 19 <interceptor-stack name="myStack"> 20 <interceptor-ref name="defaultStack"></interceptor-ref> 21 <interceptor-ref name="method1"></interceptor-ref> 22 </interceptor-stack> 23 </interceptors> 24 25 <!--设置默认拦截器--> 26 <!-- <default-interceptor-ref name="myStack"></default-interceptor-ref>--> 27 28 <action name="login_*_*" class="org.hzy.Actions.LoginAction" method="{1}"> 29 <interceptor-ref name="myStack"></interceptor-ref> 30 <result name="success" type="chain">{2}</result> 31 <result name="input">index.jsp</result> 32 <result name="error">/WEB-INF/Jsp/error.jsp</result> 33 </action> 34 <action name="query_*" class="org.hzy.Actions.QueryAction" method="{1}"> 35 <result>/WEB-INF/Jsp/show.jsp</result> 36 </action> 37 <action name="upload_*" class="org.hzy.Actions.FileUploadAction" method="{1}"> 38 <result>/WEB-INF/Jsp/show.jsp</result> 39 </action> 40 </package> 41 </struts>