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属性,其它的与上面的配置一样。