struts2拦截器

拦截器它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行

前阻止其执行,strut2核心功能都是通过拦截器来实现的。

拦截器栈:由多个拦截器组成。

作用:对于action的一些公共处理代码可以放到拦截器中来实现。如权限控制等。


Struts2核心接口和类


名称

作用

ActionMapper

根据请求的URI查找是否存在对应Action调用

ActionMapping

保存调用Action的映射信息,如namespace、name等

ActionProxy

在XWork和真正的Action之间充当代理

ActionInvocation

表示Action的执行状态,保存拦截器、Action实例

Interceptor

在请求处理之前或者之后执行的Struts 2组件




自定义一个拦截器的步骤


1 .自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

2 .在struts.xml中注册上一步中定义的拦截器。

3 .在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认

的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截

注意:如果某个action配置里面写入了interceptor的配置,那么该action就不会再有struts框架提供的默认拦截器。








编写一个计时器拦截器

第一步:创建类MyTimeInterceptor

public class MyTimeInterceptor extends AbstractInterceptor{

         @Override

         publicString intercept(ActionInvocation arg0)throwsException {

                   //预处理工作

                   System.out.println("thiis i1 start");

                   longstartTime=System.currentTimeMillis();

                   //执行后续拦截器或Action

                   String result=arg0.invoke();

        //后续处理工作

                   longexecTime=System.currentTimeMillis()-startTime;

                   System.out.println("Theinterval time is "+execTime+"ms");

                   returnresult;

         }

}


第二步:在struts.xml文件中定义拦截器

         <interceptors>

                            <interceptor name="myTimer"class="base.MyTimeInterceptor"></interceptor>

         </interceptors>

:拦截器的定义需要放在package标签的最上边


第三步:在需要添加拦截器的action中配置

<actionname="reg"class="base.RegAction">

                                     <result name="success">/regsuccess.jsp</result>

                                     <result name="fail">/reg.jsp</result>

                                     <result name="input">/reg.jsp</result>

                                     <interceptor-ref name="myTimer"></interceptor-ref>

                            </action>

注意:如果使用上述拦截器,那么reg中之前struts提供的数据校验,数据自动封装等功能将无法使用,不过我们可以加再次加入默认的拦截器


struts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器

只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器

<actionname="reg"class="base.RegAction">

                                     <result name="success">/regsuccess.jsp</result>

                                     <result name="fail">/reg.jsp</result>

                                     <result name="input">/reg.jsp</result>

                                     <interceptor-ref name="myTimer"></interceptor-ref>

                                     <interceptor-ref name="defaultStack"></interceptor-ref>

                            </action>

修改为上边代码后strtus默认提供的功能就又可以使用了



拦截器栈

从结构上看,拦截器栈相当于多个拦截器的组合

在功能上看,拦截器栈也是拦截器

<interceptors>                  

                            <interceptor name="myTimer"class="base.MyTimeInterceptor"></interceptor>

                            <interceptor name="myTimer2"class="base.MyTimer2"></interceptor>

                            <interceptor-stack name="is">

                                     <interceptor-ref name="myTimer"></interceptor-ref>

                                     <interceptor-ref name="myTimer2"></interceptor-ref>

                            </interceptor-stack>

</interceptors>

<actionname="reg"class="base.RegAction">

                                     <result name="success">/regsuccess.jsp</result>

                                     <result name="fail">/reg.jsp</result>

                                     <result name="input">/reg.jsp</result>

                                     <interceptor-ref name="is"></interceptor-ref>

                                     <interceptor-ref name="defaultStack"></interceptor-ref>

</action>





Struts 2自带拦截器

params拦截器

负责将请求参数设置为Action属性

servletConfig拦截器

将源于Servlet API的各种对象注入到Action

fileUpload拦截器

对文件上传提供支持

exception拦截器

捕获异常,并且将异常映射到用户自定义的错误页面

validation拦截器

调用验证框架进行数据验证

workflow拦截器

调用Action类的validate(),执行数据验证

 

权限拦截器

public class AuthorizationInterceptorextends AbstractInterceptor{

         @Override

         publicString intercept(ActionInvocation arg0)throwsException {

                   ActionContextac=ActionContext.getContext();

                   //通过解耦方式session对象

                   Mapsession=ac.getSession();

                   User u=(User)session.get("user");

                   if(u==null){

                            //如果用户没有登录,则返回登录页面

                            return Action.LOGIN; //login字符串常量

                   }else{

                              //如果已经登录,继续执行剩余的拦截器和Action

                            return arg0.invoke();

                   }       

         }

}       

执行Invoke将控制权交给invocation,即继续向下执行拦截器,如果是最后一个拦截器,将执行action并根据action中的返回值执行result,拦截器中的return将没有作用。

如果不执行invoke直接返回一个结果,那么将不再执行后续的拦截器,也将不再执行action,而直接根据result的值进行跳转。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值