什么是拦截器(Interceptor)
拦截器是struts2框架最重要的特性之一。它可以让你在Action 方法执行前后(Result执行之后)进行一些功能处理。在前面学习Action和学习Result的时候我们就已经开始学习拦截器了,因此现在我们对如何使用它已经不陌生了。
在学习Spring的时候我们会接触到一种设计思想,叫做面向切面编程(AOP)。也就是说我们将一些通用的功能组件抽取出来,我们在功能模块中不需要编写这些与逻辑功能无关的代码,然后我们通过某种方式(动态代理)将这些通用组件的功能附加到我们的功能模块上。Struts2中的拦截器就和这种模式差不多,Strtus2框架会将我们在配置文件中为Action配置的拦截器和Action以及Result组合在一起,附加到一个新的对象上,那么在执行的时候,只需要对这个新的对象加以操作,那么这些拦截器和Action以及Result就都可以得以执行了。这个新的对象就负责了拦截器和Action的Result的组织,它就是ActionInvocation类。
ActionInvocation代表了Action的执行状态,它持有Intercptors和Action的对象实例。通过重复的调用它的invoke方法,使得其中的Interceptors,Action和Result都得以执行。
Strtus2内建的拦截器
Strtus2内建了许多拦截器,这些可以在struts-default.xml中找到:
<interceptors>
<interceptor
name="alias"class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor
name="autowiring"class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor
name="chain"class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
<interceptor
name="conversionError"class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
<interceptor
name="cookie"class="org.apache.struts2.interceptor.CookieInterceptor"/>
<interceptor
name="clearSession"class="org.apache.struts2.interceptor.ClearSessionInterceptor"/>
<interceptor
name="createSession"class="org.apache.struts2.interceptor.CreateSessionInterceptor"/>
<interceptor
name="debugging"class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor"/>
<interceptor
name="execAndWait"
class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
<interceptor
name="exception"class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
<interceptor
name="fileUpload"class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<interceptor
name="i18n"
class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
<interceptor
name="logger"class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
<interceptor
name="modelDriven"class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
<interceptor
name="scopedModelDriven"class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
<interceptor
name="params"class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<interceptor
name="actionMappingParams"class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
<interceptor
name="prepare"class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
<interceptor
name="staticParams"class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
<interceptor
name="scope"class="org.apache.struts2.interceptor.ScopeInterceptor"/>
<interceptor
name="servletConfig"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
<interceptor
name="timer"class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
<interceptor
name="token"class="org.apache.struts2.interceptor.TokenInterceptor"/>
<interceptor
name="tokenSession"class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
<interceptor
name="validation"class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor
name="workflow"class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
<interceptor
name="store"class="org.apache.struts2.interceptor.MessageStoreInterceptor"/>
<interceptor
name="checkbox"class="org.apache.struts2.interceptor.CheckboxInterceptor"/>
<interceptor
name="profiling"class="org.apache.struts2.interceptor.ProfilingActivationInterceptor"/>
<interceptor
name="roles"class="org.apache.struts2.interceptor.RolesInterceptor"/>
<interceptor
name="annotationWorkflow"class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor"/>
<interceptor
name="multiselect"
class="org.apache.struts2.interceptor.MultiselectInterceptor"/>
</interceptors>
下面是关于这些内建拦截器的说明:
拦截器
|
名字
|
说明
|
Alias Interceptor
|
alias
|
在不同请求之间将请求参数在不同名字件转换,请求内容不变
|
Chaining Interceptor
|
chain
|
让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。
|
Checkbox Interceptor
|
checkbox
|
添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。
|
Cookies Interceptor
|
cookies
|
使用配置的name,value来是指cookies
|
Conversion Error Interceptor
|
conversionError
|
将错误从ActionContext中添加到Action的属性字段中。
|
Create Session Interceptor
|
createSession
|
自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。
|
Debugging Interceptor
|
debugging
|
提供不同的调试用的页面来展现内部的数据状况。
|
Execute and Wait Interceptor
|
execAndWait
|
在后台执行Action,同时将用户带到一个中间的等待页面。
|
Exception Interceptor
|
exception
|
将异常定位到一个画面
|
File Upload Interceptor
|
fileUpload
|
提供文件上传功能
|
I18n Interceptor
|
i18n
|
记录用户选择的locale
|
Logger Interceptor
|
logger
|
输出Action的名字
|
Message Store Interceptor
|
store
|
存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。
|
Model Driven Interceptor
|
model-driven
|
如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。
|
Scoped Model Driven
|
scoped-model-driven
|
如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。
|
Parameters Interceptor
|
params
|
将请求中的参数设置到Action中去。
|
Prepare Interceptor
|
prepare
|
如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。
|
Scope Interceptor
|
scope
|
将Action状态存入session和application的简单方法。
|
Servlet Config Interceptor
|
servletConfig
|
提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。
|
Static Parameters Interceptor
|
staticParams
|
从struts.xml文件中将中的中的内容设置到对应的Action中。
|
Roles Interceptor
|
roles
|
确定用户是否具有JAAS指定的Role,否则不予执行。
|
Timer Interceptor
|
timer
|
输出Action执行的时间
|
Token Interceptor
|
token
|
通过Token来避免双击
|
Token Session Interceptor
|
tokenSession
|
和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中
|
Validation Interceptor
|
validation
|
使用action-validation.xml文件中定义的内容校验提交的数据。
|
Workflow Interceptor
|
workflow
|
调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面
|
Parameter Filter Interceptor
|
N/A
|
从参数列表中删除不必要的参数
|
Profiling Interceptor
|
profiling
|
通过参数激活profile
|
我们通过定义拦截器栈的方式来组织这些拦截器,在前面的学习中我也接触到了struts2内建的拦截器栈drfaultStack。下面我们看一些有关拦截器的声明和配置.
拦截器的声明和配置
我们从struts-dfault.xml文件中已经看过了如何声明一个拦截器。首先拦截其的声明适应<interceptor>元素,name属性用于指定拦截器的名字,class属性用于指定拦截器的实现类。同时<interceptor>元素必须放在<interceptors>元素里。
在<interceptors>元素里可以使用<interceptor-stack>元素和<interceptor-ref>元素来定义拦截器栈和引用拦截器(或拦截器栈),还可以在使用<param>元素来向拦截器传递参数:
<interceptor-stack
name="executeAndWaitStack">
<interceptor-ref
name="execAndWait">
<param
name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
<interceptor-ref
name="defaultStack"/>
<interceptor-ref
name="execAndWait">
<param
name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
</interceptor-stack>
为action配置拦截器。这个我们在前面的学习中已经学习过了,我们可以在<package>元素中配置默认的拦截器栈,也可以在<action>元素中使用<interceptor-ref>元素来为Action配置拦截器或拦截器栈。
<package
name="default"
namespace="/"
extends="struts-default">
<interceptors>
<interceptor-stackname="luo">
<interceptor-refname="exception"/>
<interceptor-refname="alias"/>
<interceptor-refname="servletConfig"/>
<interceptor-refname="i18n"/>
<interceptor-ref
name="prepare"/>
<interceptor-refname="chain"/>
<interceptor-refname="scopedModelDriven"/>
<interceptor-refname="modelDriven"/>
<interceptor-refname="fileUpload"/>
<interceptor-refname="checkbox"/>
<interceptor-refname="multiselect"/>
<interceptor-refname="staticParams"/>
<interceptor-refname="actionMappingParams"/>
<interceptor-refname="params">
<param
name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-refname="conversionError"/>
<interceptor-refname="workflow">
<param
name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-refname="debugging"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref
name="luo"></default-action-ref>
<action
name="hello"
class="action.HelloWorld">
<result
name="success">/success.jsp</result>
<result
name="input">/input.jsp</result>
</action>
</package>
1. <actionname="helloworldAction"class="cn.javass.action.action.HelloWorldAction">
2.
<paramname="account">test</param>
3. <result>/s2impl/welcome.jsp</result>
4.
<interceptor-refname="staticParams"/>
5. <interceptor-refname="basicStack"/>
6.
</action>
注:如果要声明新的拦截器,那么必须声明在<package>元素下的<intercptors>元素下。<action>元素中只能引用拦截器,不能声明拦截器。
分享到:
相关推荐
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
STRUTS2:拦截器Interceptor
struts2 Interceptor拦截器 http://whitewolf.0fees.net
简单的拦截器例子,适合初学者学习,也是一个备忘录
Struts2.3.6实现自定义拦截器Interceptor http://blog.csdn.net/alanchen520/article/details/34086699
struts2 拦截器_教程.zip
1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. 拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按...
在struts2中使用拦截器(Interceptor)控制登录和权限[汇编].pdf
struts2,Interceptor struts2拦截器实例,两套实例,一套是针对单个的action配置的,另一套实例是针对全局的action配置的拦截器interceptor
当前struts2的filter过滤到一个.action结尾的请求的时候,会把这个请求交给struts2内部的拦截器(interceptor) 2)拦截器起到什么作用 可以帮我们丰富action的功能,比自动类型转换(页面传一个String类型的id,接收的...
NULL 博文链接:https://wang4717.iteye.com/blog/796941
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
jfinal中拦截器(Interceptor)的参数注入jfinal中拦截器(Interceptor)的参数注入
在struts2框架中主配置文件struts-defalut.xml 文件中定义了大量的拦截器和拦截器栈。通过 default-interceptor-ref元素定义了 当前应用的默认拦截器栈,对用户的每次请求都需要调用拦截器栈中的每个拦截器来拦截...
利用反射和动态代理机制实现自定义拦截器Interceptor http://blog.csdn.net/alanchen520/article/details/34087833
详细介绍struts2 interceptor
创建自己struts2拦截器,手工创建自己的拦截器实现
Struts2_自定义拦截器 struts2_3500_my_interceptor
使用Struts2实现用户权限拦截、重点是掌握拦截器的使用和配置方法,通过案例的学习,就能掌握struts中拦截器的使用方法,让我们能快速上手
综合使用servlet filter与struts2 interceptor对权限进行验证。