自定义拦截器,首先新建一个继承自AbstractInterceptor类的类,然后重写intercept方法,代码如下
public class HelloInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // TODO Auto-generated method stub System.out.println("拦截器测试"); // 放行到下一个 return invocation.invoke(); } }
一、自定义拦截器,只作用于当前Action类
新建structs-interceptor.xml文件,然后进行相关配置,使用时要记得包含到structs.xml文件中;自定义的拦截器注册在包内(即package节点下),配置在action节点下,代码如下(记得配置structs提供的默认拦截器)
<?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> <package name="interceptor" namespace="/interceptor" extends="struts-default"> <!-- 注册拦截器 --> <interceptors> <!-- name:拦截器名称;class:拦截器完整类名 --> <interceptor name="hello" class="cn.hjp.interceptor.HelloInterceptor"></interceptor> </interceptors> <action name="HelloAction" class="cn.hjp.interceptor.HelloAction"> <result name="success" type="dispatcher">/index.jsp</result> <!-- 拦截器拦截 ,自定义拦截器一般放在最前面 --> <interceptor-ref name="hello"></interceptor-ref> <!-- 如果自己配置了拦截器,不配置下面的拦截器,则struts默认的18个拦截器不在执行 --> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>
二、自定义拦截器,作用于该包下所有Action类
自定义拦截器,注册和配置都在package节点下,自定义的拦截器配置在拦截器栈中,最后还要重新配置structs的默认拦截器,这样,访问该包的action时就会走新配置的默认拦截器,代码如下
<?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> <package name="interceptor" namespace="/interceptor" extends="struts-default"> <interceptors> <!-- name:拦截器名称;class:拦截器完整类名 --> <interceptor name="hello" class="cn.hjp.interceptor.HelloInterceptor"></interceptor> <!-- 拦截器栈 --> <interceptor-stack name="myDefaultStack"> <!-- 拦截器拦截 ,自定义拦截器一般放在最前面 --> <interceptor-ref name="hello"></interceptor-ref> <!-- 如果自己配置了拦截器,不配置下面的拦截器,则struts默认的18个拦截器不在执行 --> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 将自己的拦截器栈myDefaultStack设为该包下默认拦截器栈,如此,该包下的action都会执行默认拦截器栈中的拦截器 --> <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref> <action name="HelloAction" class="cn.hjp.interceptor.HelloAction"> <result name="success" type="dispatcher">/index.jsp</result> </action> </package> </struts>
三、自定义拦截器,实现允许在其他包下也可以有效
如果想让其他包下的action使用别的包下的拦截器,那么就让新的配置文件继承自其他包
<?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> <package name="interceptor2" namespace="/interceptor" extends="interceptor"> <action name="TestInter" class="cn.hjp.test.TestInter"> <result name="success" type="dispatcher">/index.jsp</result> </action> </package> </struts>
注意:由dtd文件决定了structs配置文件书写规则,所以拦截器和action的配置是有顺序的
四、自定义指定方法的拦截器
新建一个继承自MethodFilterInterceptor的类,并实现doIntercept方法,代码如下
public class MyMethodInterceptor extends MethodFilterInterceptor { @Override protected String doIntercept(ActionInvocation invocation) throws Exception { // TODO Auto-generated method stub System.out.println("方法拦截器"); return invocation.invoke(); } }
新建一个进行测试的Action类,代码如下
public class HelloAction2 extends ActionSupport { @Override public String execute() throws Exception { // TODO Auto-generated method stub return SUCCESS; } public void add(){ System.out.println("方法拦截器---add方法"); } public void find(){ System.out.println("方法拦截器---find方法"); } public void delete(){ System.out.println("方法拦截器---delete方法"); } }
新建struts-methodInterceptor.xml文件,进行相关配置,最后记得include到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> <package name="methodInterceptor" namespace="/methodInterceptor" extends="struts-default"> <interceptors> <interceptor name="MyMethodInterceptor" class="cn.hjp.interceptor.MyMethodInterceptor"></interceptor> <interceptor-stack name="myDefaultStack"> <interceptor-ref name="MyMethodInterceptor"> <!--excludeMethods指定不进行过滤的方法,includeMethods指定过滤的方法 --> <!-- 如果只有excludeMethods,其他默认进行过滤,如果只有 includeMethods,其他默认不过滤,两个都有,其他默认不过滤--> <param name="excludeMethods">find</param><!-- 如果多个方法,用英文逗号分隔 --> <param name="includeMethods">add</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref> <action name="HelloAction2" class="cn.hjp.interceptor.HelloAction2"> <result name="success" type="dispatcher">/index.jsp</result> </action> </package> </struts>