Struts2框架自定义拦截器

Struts2中把某些公共性的功能放置到拦截器中,一般一个拦截器只负责一个功能.
拦截器的与过滤器有很多的相似之处,其中过滤器依赖于servlet容器,拦截器基于反射,不依赖servlet容器,
过滤器主要拦截action请求,过滤器可以根据配置文件过滤,过滤器的影响范围更大
执行时机过滤器早于拦截器
自定义拦截器

  1. 实现 Interceptor接口,该方法里面需要实现destroy(),init()intercept()方法,但是主要使用的只有intercept()实现代码如下:
public class HibernateInterceptor implements Interceptor {
@Override
   public void destroy() {
   	// TODO Auto-generated method stub		
   }
   @Override
   public void init() {
   	// TODO Auto-generated method stub
   }
   @Override
   public String intercept(ActionInvocation ai) throws Exception {
   	System.out.println("过滤器前操作");
   	String s = ai.invoke();
   	System.out.println("过滤器后操作");
   	return s;
   }
}
  1. 继承AbstractInterceptor抽象类,这个方法只需要实现使用的intercept()方法即可
    代码如下:
public class HibernateInterceptor extends AbstractInterceptor {

   @Override
   public String intercept(ActionInvocation ai) throws Exception {
   	HibernateUtil.getSession();
   	String invoke = ai.invoke();
   	HibernateUtil.closeSession();
   	return invoke;
   }
}
  1. 方法过滤拦截方式,可以在设置全部拦截之后设置访问某些action方法时不拦截,比如获取是否登录才能进行发消息,不能拦截登录访问,注册访问等等.此方法需要继承MethodFilterInterceptor抽象类,实现其中的doIntercept()方法,在实现方法时与实现上述两种的方式类似,但是在配置action标签是有所不同,代码如下:
    Java代码:
public class HibernateInterceptor extends MethodFilterInterceptor {
	@Override
	protected String doIntercept(ActionInvocation ai) throws Exception {
		System.out.println("前处理");
		String s = ai.invoke();
		System.out.println("后处理");
		return s;
	}
}

普通拦截xml配置文件,先配置哪个拦截器则先运行哪个拦截器,运行顺序为123321,其中前123为过滤器的前处理,321为过滤器的后处理,在执行invoke方法后,其返回的逻辑视图修改无效.

  <interceptors>
           <interceptor name="HibernateInterceptor" class="cn.filter.HibernateInterceptor"></interceptor>
           <interceptor-stack name="myInterceptor">
               <interceptor-ref name="HibernateInterceptor"></interceptor-ref>             
               <interceptor-ref name="defaultStack"></interceptor-ref>
           </interceptor-stack>      
       </interceptors>
       <default-interceptor-ref name="myInterceptor"></default-interceptor-ref>

也可不配置default-interceptor-ref标签,在每个action中加入即可,自定义拦截器后,必须继承``,要不然Struts自带的拦截器不再通过,当然,对Struts拦截器比较熟悉的可以自定义配置使用哪个struts拦截器

方法过滤xml配置文件

  <interceptors>
           <interceptor name="HibernateInterceptor" class="cn.filter.HibernateInterceptor"></interceptor>
           <interceptor-stack name="myInterceptor">
               <interceptor-ref name="HibernateInterceptor">
               <param name="excludeMethods">方法名</param>
               </interceptor-ref>             
               <interceptor-ref name="defaultStack"></interceptor-ref>
           </interceptor-stack>      
       </interceptors>
       <default-interceptor-ref name="myInterceptor"></default-interceptor-ref>

此时,在访问<param name="excludeMethods">方法名</param>中的方法名时控制台不会打印前处理后处理,同样,也可以设置不拦截的方法,把其name属性值改为includeMethods即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值