Struts2的拦截器体系是一种AOP设计哲学。Strut2的拦截器可以动态地拦截发送到指定Action的请求,通过拦截器机制,可以在Action执行前后插入某些代码,通过这种方式可以把多个Action中需要重复指定的代码提取出来,在拦截器中定义,从而提供更好的代码重用。拦截器体系是Struts2的一个重要组成部分,Struts2框架就是由大量的内置拦截器来实现的。另外,它是即插即用的,即当我们需要使用某个拦截器时,只需要在配置文件中应用中该拦截器即可,如果不需要使用拦截器,也只需要取消在配置文件中该拦截器,不管是否应用某个拦截器,对于整个Strut2框架不会有任何影响的。

Struts框架提供了很多拦截器,它实现Struts2的大部分功能,能满意大部分应用的能用功能,但要实现系统逻辑相关的功能时,需要使用用户自定义拦截器:

如果用户要开发自己的拦截类,需要实现Interceptor接口,它包括三个方法:

Init()

destroy()

intercept(ActionInvocation action)

一般来说只需要实现最后一个方法即可,所以Struts2提供了一个AbstractInterceptor类,它提供了initdestory方法的空实现。在实际的开发中时,只需要继承AbstractInterceptor来实现自定义拦截器。下面实现一个简单的拦截器:

      实现拦截器类(SimpleInterceptor.java):
    
package my;
import java.util.Date;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.ActionInvocation;
public class SimpleInterceptor extends AbstractInterceptor
{
    
private String name;
    
public void setName(String name)
    
{
        
this.name = name;
    }

    
public String intercept(ActionInvocation invocation)throws Exception
    
{
        LoginAction action 
= (LoginAction)invocation.getAction();
        System.out.println(name
+"拦截器的动作:开始执行登录Action的时间为:"+new Date());
        
if(action.getTip().equals("flying"))
        
{
           System.out.println(
"user name error");
           
           
return "input";
        }

        
long start = System.currentTimeMillis();
        String result 
= invocation.invoke();
        System.out.println(name
+"拦截器的动作:执行完登录Action的时间为:" + new Date());
        
long end = System.currentTimeMillis();
        System.out.println(
"拦截器的动作:执行action事件的时间是:"+(end-start)+"毫秒");
        
return result;
    }

}
配置拦截器(Struts.xml):
<?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="strutsqs" extends="struts-default">
        
<interceptors>
            
<interceptor name="mysimple" class="my.SimpleInterceptor">
                
<param name="name">simple</param>
            
</interceptor>
        
</interceptors>
        
<action name="Login" class="my.LoginAction">

            
<result name="input">/login.jsp</result>
            
<result name="success">/success.jsp</result>
            
<interceptor-ref name="defaultStack"/>
            
<interceptor-ref name="mysimple">
                
<param name="name">my</param>
            
</interceptor-ref>
        
</action>
        
    
</package>

</struts>

这样即实现一个简单的拦截器,默认下,譔拦截器拦截了Action中的所有方法,如果我们只需要拦截某个方法,Struts2提供了一个MethodFilterInterceptor类对Action中方法过滤的功能,MethodFilterInterceptor是AbstractInterceptor类的子类,如果要实现拦截器方法过滤功能,则需要继承MethodFilterInterceptor。用户只需要重写MethodFilterInteceptor中的doInterceptor(ActionInvocation action)即可。其内容实际上与interceptor一样。
为了实现方法过滤只需要在interceptor的配置文件里设置两个属性:
    excludeMethods:指定不需要拦截的方法名
    includeMethods:指定需要拦截的方法名
若一个方法同时出现中,则该方法将被拦截。
一个方法过滤的拦截器实现(SimpleInterceptor.java)与上面的一样:
package my;
import java.util.Date;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.ActionInvocation;
public class SimpleInterceptor extends MethodFilterInterceptor
{
    
private String name;
    
public void setName(String name)
    
{
        
this.name = name;
    }

    
public String doIntercept(ActionInvocation invocation)throws Exception
    
{
        LoginAction action 
= (LoginAction)invocation.getAction();
        System.out.println(name
+"拦截器的动作:开始执行登录Action的时间为:"+new Date());
        
if(action.getTip().equals("flying"))
        
{
           System.out.println(
"user name error");
           
           
return "input";
        }

        
long start = System.currentTimeMillis();
        String result 
= invocation.invoke();
        System.out.println(name
+"拦截器的动作:执行完登录Action的时间为:" + new Date());
        
long end = System.currentTimeMillis();
        System.out.println(
"拦截器的动作:执行action事件的时间是:"+(end-start)+"毫秒");
        
return result;
    }

}

配置方法过滤拦截器(Struts.xml):
<?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="strutsqs" extends="struts-default">
        
<interceptors>
            
<interceptor name="mysimple" class="my.SimpleInterceptor">
                
<param name="name">simple</param>
            
</interceptor>
        
</interceptors>
        
<action name="Login" class="my.LoginAction">

            
<result name="input">/login.jsp</result>
            
<result name="success">/success.jsp</result>
            
<interceptor-ref name="defaultStack"/>
            
<interceptor-ref name="mysimple">
                
<param name="name">my</param>
                
<param name="excludeMethods">execute</param>
            
</interceptor-ref>
        
</action>
        
    
</package>

</struts>
上面只在引用拦截器时注入一个excludeMethods属性,其它的与上面的配置一样。