struts2拦截器.docx

上传人:b****6 文档编号:8752314 上传时间:2023-05-14 格式:DOCX 页数:16 大小:20.91KB
下载 相关 举报
struts2拦截器.docx_第1页
第1页 / 共16页
struts2拦截器.docx_第2页
第2页 / 共16页
struts2拦截器.docx_第3页
第3页 / 共16页
struts2拦截器.docx_第4页
第4页 / 共16页
struts2拦截器.docx_第5页
第5页 / 共16页
struts2拦截器.docx_第6页
第6页 / 共16页
struts2拦截器.docx_第7页
第7页 / 共16页
struts2拦截器.docx_第8页
第8页 / 共16页
struts2拦截器.docx_第9页
第9页 / 共16页
struts2拦截器.docx_第10页
第10页 / 共16页
struts2拦截器.docx_第11页
第11页 / 共16页
struts2拦截器.docx_第12页
第12页 / 共16页
struts2拦截器.docx_第13页
第13页 / 共16页
struts2拦截器.docx_第14页
第14页 / 共16页
struts2拦截器.docx_第15页
第15页 / 共16页
struts2拦截器.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

struts2拦截器.docx

《struts2拦截器.docx》由会员分享,可在线阅读,更多相关《struts2拦截器.docx(16页珍藏版)》请在冰点文库上搜索。

struts2拦截器.docx

struts2拦截器

理解拦截器

1.1.   什么是拦截器:

拦截器,在AOP(Aspect-OrientedProgramming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

拦截是AOP的一种实现策略。

在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。

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

同时也是提供了一种可以提取action中可重用的部分的方式。

谈到拦截器,还有一个词大家应该知道——拦截器链(InterceptorChain,在Struts2中称为拦截器栈InterceptorStack)。

拦截器链就是将拦截器按一定的顺序联结成一条链。

在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

1.2.   拦截器的实现原理:

大部分时候,拦截器方法都是通过代理的方式来调用的。

Struts2的拦截器实现相对简单。

当请求到达Struts2的ServletDispatcher时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。

2.   拦截器的配置

Struts2已经为您提供丰富多样的,功能齐全的拦截器实现。

大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

Struts2(XWork)提供的拦截器的功能说明:

拦截器

名字

说明

AliasInterceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

ChainingInterceptor

chain

让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。

CheckboxInterceptor

checkbox

添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。

CookiesInterceptor

cookies

使用配置的name,value来是指cookies

ConversionErrorInterceptor

conversionError

将错误从ActionContext中添加到Action的属性字段中。

CreateSessionInterceptor

createSession

自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

DebuggingInterceptor

debugging

提供不同的调试用的页面来展现内部的数据状况。

ExecuteandWaitInterceptor

execAndWait

在后台执行Action,同时将用户带到一个中间的等待页面。

ExceptionInterceptor

exception

将异常定位到一个画面

FileUploadInterceptor

fileUpload

提供文件上传功能

I18nInterceptor

i18n

记录用户选择的locale

LoggerInterceptor

logger

输出Action的名字

MessageStoreInterceptor

store

存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。

ModelDrivenInterceptor

model-driven

如果一个类实现了ModelDriven,将getModel得到的结果放在ValueStack中。

ScopedModelDriven

scoped-model-driven

如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。

ParametersInterceptor

params

将请求中的参数设置到Action中去。

PrepareInterceptor

prepare

如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

ScopeInterceptor

scope

将Action状态存入session和application的简单方法。

ServletConfigInterceptor

servletConfig

提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。

StaticParametersInterceptor

staticParams

从struts.xml文件中将中的中的内容设置到对应的Action中。

RolesInterceptor

roles

确定用户是否具有JAAS指定的Role,否则不予执行。

TimerInterceptor

timer

输出Action执行的时间

TokenInterceptor

token

通过Token来避免双击

TokenSessionInterceptor

tokenSession

和TokenInterceptor一样,不过双击的时候把请求的数据存储在Session中

ValidationInterceptor

validation

使用action-validation.xml文件中定义的内容校验提交的数据。

WorkflowInterceptor

workflow

调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面

ParameterFilterInterceptor

N/A

从参数列表中删除不必要的参数

ProfilingInterceptor

profiling

通过参数激活profile

      在struts.xml文件中定义拦截器,拦截器栈:

       

       

--定义拦截器-->

       

       

--定义拦截器栈-->

       

           

           

       

       

       ......

3.   使用拦截器

一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截Action了。

拦截器的拦截行为将会在Action的exceute方法执行之前被执行。

           /success.jsp

           /error.jsp

--使用拦截器,一般配置在result之后,-->

--引用系统默认的拦截器-->

           

       

      此处需要注意的是,如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。

为了继续使用默认拦截器,所以上面配置文件中手动引入了默认拦截器。

4.   自定义拦截器

作为“框架(framework)”,可扩展性是不可或缺的。

虽然,Struts2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts2自定义拦截器是相当容易的一件事。

4.1.   实现拦截器类:

所有的Struts2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。

该接口提供了三个方法:

1)     voidinit();在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。

对于每个拦截器而言,此方法只执行一次。

2)     voiddestroy();该方法跟init()方法对应。

在拦截器实例被销毁之前,系统将回调该方法。

3)     Stringintercept(ActionInvocationinvocation)throwsException;该方法是用户需要实现的拦截动作。

该方法会返回一个字符串作为逻辑视图。

除此之外,继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor是更简单的一种实现拦截器类的方式,因为此类提供了init()和destroy()方法的空实现,这样我们只需要实现intercept方法。

4.2.   使用自定义拦截器:

两个步骤:

l通过元素来定义拦截器。

l通过元素来使用拦截器。

5.   自定义拦截器示例

5.1.   问题描述:

使用自定义拦截器来完成用户权限的控制:

当浏览者需要请求执行某个操作时,应用需要先检查浏览者是否登录,以及是否有足够的权限来执行该操作。

5.2.   实现权限控制拦截器类:

AuthorizationInterceptor.java

packagemon;

importjava.util.Map;

importcom.opensymphony.xwork2.Action;

importcom.opensymphony.xwork2.ActionInvocation;

importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;

/**

*权限检查拦截器

*

*@authorqiujy

*@version1.0

*/

publicclassAuthorizationInterceptorextendsAbstractInterceptor{

   /*

   *拦截Action处理的拦截方法

   *

   */

   publicStringintercept(ActionInvocationinvocation)throwsException{

       

       Mapsession=invocation.getInvocationContext().getSession();

       StringuserName=(String)session.get("userName");

       

       if(null!

=userName&&userName.equals("test")){

           System.out.println("拦截器:

合法用户登录---");

           returninvocation.invoke();

       }else{

           System.out.println("拦截器:

用户未登录---");

           returnAction.LOGIN;

       }

   }

}

5.3.   配置权限控制拦截器:

struts.xml:

DOCTYPEstrutsPUBLIC

       "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

       "http:

//struts.apache.org/dtds/struts-2.0.dtd">

   

       

       

       

--定义权限控制拦截器-->

       

       

       

       

--定义全局处理结果-->

       

       

--逻辑名为login的结果,映射到/login.jsp页面-->

       /login.jsp

       

       

       

           /listall.jsp

           

--使用拦截器-->

           

           

       

       

       

           /success.jsp

       

   

      其它页面见源代码。

5.4.   运行调试:

在浏览器地址栏直接输入http:

//localhost:

8080/AuthorityInterceptorDemo/listall.action来访问,此动作配置了权限拦截器,所有被转到登录页面。

登录后:

再访问http:

//localhost:

8080/AuthorityInterceptorDemo/listall.action这个链接:

如果为了简化struts.xml文件的配置,避免在每个Action重复配置该拦截器,可以将拦截器配置成了一个默认拦截器栈。

如下:

DOCTYPEstrutsPUBLIC

       "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

       "http:

//struts.apache.org/dtds/struts-2.0.dtd">

   

       

           

--定义权限控制拦截器-->

           

               class="mon.AuthorizationInterceptor"/>

           

--定义一个包含权限控制的拦截器栈-->

           

               

               

           

       

       

       

--定义默认拦截器-->

       

       

--定义全局处理结果-->

       

           

--逻辑名为login的结果,映射到/login.jsp页面-->

           /login.jsp

       

       

           class="org.qiujy.web.struts2.action.UserAction"

           method="listAllUser">

           /listall.jsp

       

   

   

   

       

           /success.jsp

       

   

一旦在某个包下定义了默认拦截器栈,在该包下的所有action都会使用此拦截器栈。

对于那些不想使用些拦截器栈的action,则应该将它放置在其它的包下。

 

Struts2的拦截器MethodFilterInterceptor-good

Struts2的拦截器体系是一种AOP设计哲学。

Strut2的拦截器可以动态地拦截发送到指定Action的请求,通过拦截器机制,可以在Action执行前后插入某些代码,通过这种方式可以把多个Action中需要重复指定的代码提取出来,在拦截器中定义,从而提供更好的代码重用。

拦截器体系是Struts2的一个重要组成部分,Struts2框架就是由大量的内置拦截器来实现的。

另外,它是即插即用的,即当我们需要使用某个拦截器时,只需要在配置文件中应用中该拦截器即可,如果不需要使用拦截器,也只需要取消在配置文件中该拦截器,不管是否应用某个拦截器,对于整个Strut2框架不会有任何影响的。

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

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

Init()

destroy()

intercept(ActionInvocationaction)

一般来说只需要实现最后一个方法即可,所以Struts2提供了一个AbstractInterceptor类,它提供了init和destory方法的空实现。

在实际的开发中时,只需要继承AbstractInterceptor来实现自定义拦截器。

下面实现一个简单的拦截器:

     实现拦截器类(SimpleInterceptor.java):

    

packagemy;

importjava.util.Date;

importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;

importcom.opensymphony.xwork2.ActionInvocation;

publicclassSimpleInterceptorextendsAbstractInterceptor

{

    privateStringname;

    publicvoidsetName(Stringname)

   {

        this.name=name;

    }

    publicStringintercept(ActionInvocationinvocation)throwsException

   {

        LoginActionaction=(LoginAction)invocation.getAction();

        System.out.println(name+"拦截器的动作:

开始执行登录Action的时间为:

"+newDate());

        if(action.getTip().equals("flying"))

       {

           System.out.println("usernameerror");

          

           return"input";

        }

        longstart=System.currentTimeMillis();

        Stringresult=invocation.invoke();

        System.out.println(name+"拦截器的动作:

执行完登录Action的时间为:

"+newDate());

        longend=System.currentTimeMillis();

        System.out.println("拦截器的动作:

执行action事件的时间是:

"+(end-start)+"毫秒");

        returnresult;

    }

}

配置拦截器(Struts.xml):

xmlversion="1.0"

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2