拦截器

一)Action拦截器:拦截某个指定的Action(请求)

1、定义拦截器

package com.interceptor;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class InterceptorDemo1 extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
		   String user =(String) ActionContext.getContext().getSession().get("user");
		   if(user == null || "".equals("user"))
			   return "fail";		
		return invocation.invoke();
	}

}

2、配置struts.xml文件

//如果在项目中使用了自定义的拦截器,那么默认拦截器将不在起作用。

   <package name = "default" namespace = "/" extends = "struts-default">
    
     <interceptors>
         <interceptor name="interceptor1" class="com.interceptor.InterceptorDemo1"/>
     </interceptors>
     
     <action name = "log*" class = "com.acion.LoginAction" method = "log{1}">
        <result name = "success" >/log{1}.jsp</result>
     </action>
     
     <action name = "adduser" class = "com.acion.UserAction" method = "execute">
        <result name = "success" >/adduser.jsp</result>
        <result name = "fail"  type = "redirect">/login.jsp</result>
        <interceptor-ref name="interceptor1"/>
        <interceptor-ref name="defaultStack"/>
     </action>
   </package>

Action拦截只能拦截部分请求,如果需要大面积拦截,就会出现很多重复代码。


二)、全局拦截:将指定的Action统一拦截。与Action拦截的区别在于配置文件上。

   <package name = "default" namespace = "/" extends = "struts-default">
     <interceptors>
         <interceptor name="interceptor1" class="com.interceptor.InterceptorDemo1"/>
         <!-- 将默认拦截器和自定义拦截器放入拦截器栈中 -->
         <interceptor-stack name="Mystack">
            <interceptor-ref name="interceptor1"/>
            <interceptor-ref name="defaultStack"></interceptor-ref>
         </interceptor-stack>
     </interceptors>
     
     <default-interceptor-ref name="Mystack"/>
     
     <action name = "log*" class = "com.acion.LoginAction" method = "log{1}">
        <result name = "success" >/log{1}.jsp</result>
     </action>
     
     <action name = "adduser" class = "com.acion.UserAction" method = "execute">
        <result name = "success" >/adduser.jsp</result>
        <result name = "fail"  type = "redirect">/login.jsp</result>
     </action>
   </package>

拦截器代码:

package com.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class InterceptorDemo2 extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("调用拦截器");
		return invocation.invoke();
	}

}


1、返回值问题:因为全局拦截将包中所有拦截器都拦截掉,但拦截器的返回值只能固定一个,在所有被拦截器中,需要配置与拦截器返回值相同的全局结果集。

   <package name = "default" namespace = "/" extends = "struts-default">
     <interceptors>
         <interceptor name="interceptor1" class="com.interceptor.InterceptorDemo1"/>
         <!-- 将默认拦截器和自定义拦截器放入拦截器栈中 -->
         <interceptor-stack name="Mystack">
            <interceptor-ref name="interceptor1"/>
            <interceptor-ref name="defaultStack"></interceptor-ref>
         </interceptor-stack>
     </interceptors>
     
     <default-interceptor-ref name="Mystack"/>
     <global-results >
       <result name = "fail"  type = "redirect">/login.jsp</result>
     </global-results>
     
     <action name = "log*" class = "com.acion.LoginAction" method = "log{1}">
        <result name = "success" >/log{1}.jsp</result>
     </action>
     
     <action name = "adduser" class = "com.acion.UserAction" method = "execute">
        <result name = "success" >/adduser.jsp</result>
     </action>
   </package>


2、其中包中的个别Action又不希望被拦截,譬如:登陆,注册等等。两种解决方案。

(1)、将这些功能直接放入jsp页面不使用Action     注意:不要轻易暴露实际操作性的jsp地址

(2)、将这些不需要拦截的Action放入另外的一个包中,或者使用方法拦截


三)、方法拦截

如果Action中有很多方法,拦截器默认将这些方法全部拦截掉,而有时候不需要全部拦截掉,此时需要方法拦截器。

(1)定义拦截器:继承MethodFilterInterceptor类

package com.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class InterceptorDemo3 extends MethodFilterInterceptor {

	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("执行拦截");
		return invocation.invoke();
	}

}
(2)配置struts.xml文件

   <package name = "default" namespace = "/" extends = "struts-default">
   <interceptors>
     <interceptor name="interceptor3" class="com.interceptor.InterceptorDemo3"/>
   </interceptors>
   
     <action name = "log*" class = "com.acion.LoginAction" method = "log{1}">
        <result name = "success" >/log{1}.jsp</result>
     </action>
     
     <action name = "*user" class = "com.acion.UserAction" method = "{1}">
        <result name = "success" >/{1}user.jsp</result>
        <interceptor-ref name="interceptor3">
          <param name="includeMethods">add,edit</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack"/>
     </action>
   </package>


第二种:
        <interceptor-ref name="interceptor3">
          <param name="includeMethods">add,edit</param>
        </interceptor-ref>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏油

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值