Structs2拦截器详解

 

 

 

默认的拦截器栈设计用来服务于大多数应用程序.很多应用程序不需要添加拦截器或改变拦截器栈.
很多Action共享关联.一些Action需要输入验证.另一个Action可能需要一个预处理的文件上传.另一个Action可能需要保护来自一个double的提交.一些Action需要从列表中去除和页面驻留在页面显示前.
Struts Action框架使得很容易解分开决这些问使用“Interceptor”策略.当你请求一个资源,它映射到一个”action”,框架调用Action对象.但是在Action执行前,调用可以被拦截通过另一个对象.在Action执行后,调用可以再次的被拦截.我们称这些对象为”Interceptors”(拦截器)
Understanding Interceptors(理解拦截器)
拦截器可以执行代码在Action执行前后.很多框架核心功能是实现拦截.此特征有点像重复提交的保护,类型转换,对象驻留,验证,文件上传,页在预处理,和更多.所有的准备都是在拦截器的帮助下完成.每个拦截器就像是一个插件,所以你可以决定精确的特性,那个Action需要被支持.
拦截器可以被配置基于独立的Action.你可以自定义拦截器混合和匹配拦截器同框架绑定.拦截器”set the stage(设置阶段)”为Action类.做很多重量级事情在Action执行前.
Action的生命周期
在一些情况下,一个拦截器将保持Action被激活,因为一个重复提交或验证失败.拦截器也可以改变Action执行前的状态.
拦截器定义在一个栈中指定执行的顺序.在一些情况下,拦截器在栈中的顺序是非常重要的.
Configuring Interceptors(配置拦截器)
Struts.xml
<package name="default" extends="struts-default">
      <interceptors>
          <interceptor name="timer" class=".."/>
          <interceptor name="logger" class=".."/>
      </interceptors>
      <action name="login"
         class="tutorial.Login">
           <interceptor-ref name="timer"/>
           <interceptor-ref name="logger"/>
            <result name="input">login.jsp</result>
            <result name="success"
               type="redirect-action">/secure/home</result>
      </action>
</package>
查看struts-default.xml,我们可以看它是如何做的.
The Default Configuration(默认的配置)
struts-default.xml (struts2-core-2.X.X.jar根目录)
因为struts-default.xml包含了应用程序的默认配置,所有的预先定义拦截器和栈可用”out of the box”.
Framework Interceptors(框架的拦截器)
     拦截器类也是使用键值对定义在指定的Struts配置文件中.名字指定在struts-default.xml文件中.如果你继承了struts-defaut包,这样你可以使用名字了.否则,他们必需定义在你的包中使用name-class对指定在<interceptors>标签.

一个抽像的拦截器被应用,选择相应included/exclude方法列表.
指下如下参数:
     .execludeMethods-方法名被排除
     .includeMethods-方法名被包含
注意:如果方法名可用在IncludeMethods和excludeMethods,它将被考虑为一个included方法.总之,includeMethods优于excludeMethods.
扩展拦截器的这个能力将是:
       *     TokenInterceptor
       * TokenSessionStoreInterceptor
       * DefaultWorkflowInterceptor
       * ValidationInterceptor
Interceptor Parameter Overriding(拦截器参数覆盖)
拦截器的参数可以被覆盖通过下面的方式:
方法1:
<action name="myAction" class="myActionClass">
     <interceptor-ref name="exception"/>
       <interceptor-ref name="alias"/>
       <interceptor-ref name="params"/>
       <interceptor-ref name="servlet-config"/>
       <interceptor-ref name="prepare"/>
       <interceptor-ref name="i18n"/>
       <interceptor-ref name="chain"/>
       <interceptor-ref name="model-driven"/>
       <interceptor-ref name="fileUpload"/>
       <interceptor-ref name="static-params"/>
       <interceptor-ref name="params"/>
       <interceptor-ref name="conversionError"/>
       <interceptor-ref name="validation">
         <param name="excludeMethods">myValidationExcudeMethod</param>
       </interceptor-ref>
       <interceptor-ref name="workflow">
         <param name="excludeMethods">myWorkflowExcludeMethod</param>
       </interceptor-ref>
</action>
方法2:
<action name="myAction" class="myActionClass">
     <interceptor-ref name="defaultStack">
       <param name="validation.excludeMethods">myValidationExcludeMethod</param>
       <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
     </interceptor-ref>
</action>
在第一种方法,整个默认栈被拷贝并且参数相应的改变.
在第二种方法,引用一个已存在的拦截器栈,就是例子中的default-stack,覆盖验证器和工作流拦截器excludeMethods典型应用列子.注意在标签中,name属性包含一个点(.),点前面的词指定拦截器名被覆盖和点后面的词指定参数本身.如下所示:
<interceptor-name>.<parameter-name>
注意:同样是这种情况name属性用来指示拦截器栈,如果它引用拦截本身将会使用方法1所描述的.
Order of Interceptor Execution(拦截器执行顺序)
拦截器提供了一个非常好的包装在处理的前后.这个概念减少了重复代码.
<interceptor-stack name="xaStack">
     <interceptor-ref name="thisWillRunFirstInterceptor"/>
     <interceptor-ref name="thisWillRunNextInterceptor"/>
     <interceptor-ref name="followedByThisInterceptor"/>
     <interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>
注意:相同的拦截器将会中断statck/chain/flow …所以顺序是非常重要的.
拦截器实现com.opensymphony.xwork.interceptor.PreResultListener将会运行在Action execute之后但是在Result执行之前.
thisWillRunFirstInterceptor
     thisWillRunNextInterceptor
       followedByThisInterceptor
         thisWillRunLastInterceptor
           MyAction1
           MyAction2 (chain)
           MyPreResultListener
           MyResult (result)
         thisWillRunLastInterceptor
       followedByThisInterceptor
     thisWillRunNextInterceptor
thisWillRunFirstInterceptor

Alias Interceptor(别名拦截器)
这个拦截器的目标是为name参数取一个别名到不同的name参数.充当胶水来连接Action共享相同的参数(但是不同名字),它连接成链非常有帮助.
Action的别名表达式应访是#{"name1" : "alias1", "name2" : "alias2" }的形式.这意味着,假定一个Action(或一些其它在栈中)有一个表达式名字name1值和这个Action的拦截器应用到一个setter名字是alias1,alias1将被设置值从name1.
参数: aliasesKey(可选)-Action的名字参数查找别名映射(默认是aliases).
Extending the Interceptor(扩展拦截器)
这个拦截器没有任何的扩展点.
例子
<action name="someAction" class="com.examples.SomeAction">
       <!-- The value for the foo parameter will be applied as if it were named bar -->
       <param name="aliases">#{ 'foo' : 'bar' }</param>
       <interceptor-ref name="alias"/>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>


Chaining Interceptor(链拦截器)
拦截器拷贝值栈中每个对象的所有属性到当前执行对象,除非对像实现Unchainable.一收集选项includes 和 excludes可能提供控制和那一个参数将会被拷贝.仅includes或execludes可以被指定.指定两者未定义的行为.见Java文档{@link OgnlUtil#copy(Object, Object, java.util.Map, java.util.Collection, java.util.Collection)}获取更多的信息.
记着如果实际上没有对象在栈中,这个拦截器什么也不做是很重要的.这意味着两件事情:一是,你可以安全的应用它到你的所有Action不用担心任何不利的影响.二是,在你的Action调用之前确保栈中存在一个对象.常见的方法是通过使用chain结果类型,他组个这个拦截器来确保Action链特性.
参数:
     .excludes(可选)-名字列表将会从拷贝中排除(所有的其它将会被包含).
     .includes(可选)-名字列表将会被拷贝(所有的其它将会被排除).
Extending the Interceptor(扩展拦截器)
该拦截器没有扩展点。
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="basicStack"/>
       <result name="success" type="chain">otherAction</result>
</action>
<action name="otherAction" class="com.examples.OtherAction">
       <interceptor-ref name="chain"/>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>


Checkbox Interceptor(checkbox拦截器)
查找隐藏标识字段指定checkbox的最初值.如果checkbox不提交,插入到参数如果它的值为’false’.
参数:
      . setUncheckedValue-默认的没检查可以被覆盖通过设置’uncheckedValue’属性
扩展拦截器 无

Conversion Error Interceptor(转换错误拦截器)
最好查找interceptor子类的JavaDocs,这个拦截器的完整文档, ConversionErrorInterceptor:
这个拦截器添加的任何错误可以在ActionContext的转换错误中找到映射为一个字段错误(Action实现ValidationAware来提供的).另外,一些字段验证错误原始值被保存,这样随后的请求值返回原始值胜于Action中的值.
这其实是很重要的,因为,如果提交”abc”不能够转换成一个int,我们再次显示原始字符串(“abc”)胜于显示int类型值(像0,在很少的声景中用户使用).
JavaDocs中拦截器本射, StrutsConversionErrorInterceptor:
这个拦截器继承了ConversionErrorInterceptor但是仅添加ActionContext中Action的字段错误转换,如果字段值不是null,””,或者{“”}(长度为1的字符串数组和一个空字符串).见ConversionErrorInterceptor获取更多信息,同类型转换文档.
参数 .None
扩展拦截器
这个拦截器没有扩展点.
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="params"/>
       <interceptor-ref name="conversionError"/>
       <result name="success">good_result.ftl</result>
</action>

Create Session Interceptor(创建会话拦截器)
这个拦截器创建HttpSession.
这个特别有用当你使用<@s.token>标签在freemarker模板中.使用这个标签要求HttpSession已经被创建,因为freemarker立即提交响应用客户端.
参数     .None
扩展拦截器 .None
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="create-session"/>
       <interceptor-ref name="defaultStack"/>
       <result name="input">input_with_token_tag.ftl</result>
</action>

DebuggingInterceptor(调试拦截器)
提供不同的调试视图,提供检查页面后台数据的能力.
这个拦截器仅在struts.properties文件中devMode被开启时激活.’debug’参数从参数列表中移除在Action执行前.所有的操作发生在原始结果前有机会执行.
参数
.xml-返回参数,上下文,会话和值栈以XML文档的形式.
.console-显示一个弹出的’OGNL控制台’允许用户测试OGNL表式在值栈中.XML数据从’xml’模式被插入到页的顶部.
.command=测试OGNL表达式并且返回字符串结果.仅用于OGNL控制台.
例子
http://localhost:8080/Welcome.action?debug=xml


Execute and Wait Interceptor(执行和等待拦截器)
ExecuteAndWaitInterceptor对长期的后台运作非常好当展示给用户一人进度时.这也会阻止HTTP请求超时当Action超进5或10分钟.
使用这个拦截器是一个非常漂亮的forward.假定你的程序中包括了struts-default.xml,这个拦截器已经配置了,但是不是默认栈的一部分.因为拦截器的本质是它必需最后拦截在在栈中.
这个拦截器工作在独立会话基础上.这意味着同名的Action(myLongRunningAction,在上面的例子中)不能被运行多于一次在一个给定的Session中.在初始请求或任何后面的请求(在Action完成前),wait结果将被返回.wait结果负责分发后面的请求到Action,给出一个自我更新的进度.
如果没有”wait”结果被找到,Struts将灵活的自动生成wait结果.这个结果写在FreeMarker和在没有Freemarker安装的情况下不能够运行.如果你不想部署FreeMarker,你必需提供你自己的wait结果.这是一个好事情不管怎么做,当缺省的等待页非常的清晰.
每当wait结果被返回,Action运行在后台时将被放置到栈的顶部.这允许你程度数据,像一个数量,在等待页中.使用wait页面自动重装载请求到Action(它将通过拦截器被绕过).你可以给出一个进度.
这个拦截器也支持使用一个初始等待的延迟.在wait页面返回给用户前,一个初始化延迟是让服务器等待数毫秒的时间.在等待期间,这个拦截器将会隔100毫秒被唤醒一次检查后台进程是否提前完成,因些,如果一项工作要花费很长时间等待页不会显示给用户.
这是一个有用的例子查找Action有很长的执行时间.使用一个2000秒的延迟时间来阻止用户的快速查询结果并且显示一个等待页面.
重点:因为Action将会运行在分开的线程中,你不能够使用ActionContext因为它是一个ThreadLocal.这意味着你需要访问,例如,会话数据,你需要实SessionAware胜于调用ActionContext.getSession().
以actionNameBrackgroundProcess形式命名的线程将会被拦截器踢下线.例如,查询Action将会运行作为一个线程名字为searchBackgroundProcess.
参数
     . threadPriority(可选)-优先分配线程.默认是Thread.NORM_PRIORITY.
     .delay(可选)- 一个初始化延迟数毫秒的等待在等待页面显示前(返回wait作为一个resut代码).默认无初始化延迟.
     .delaySleepInterval(可选)-仅用于延迟.用来唤醒固定的间隔延迟检查是否后台处理完成。默认是100毫秒.
扩展拦截器
如果你想指定准备前和/或准备后调用后台进程.你可以继承BackgroundProcess类和实现beforeInvocation()和afterInvoction()方法.后台处理执行成功时,会非常有用来获取和释放资源.使用后台处理扩展,继承ExecuteAndWaitInterceptor和实现getNewBackgroundProcess()方法.
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="completeStack"/>
       <interceptor-ref name="execAndWait"/>
       <result name="wait">longRunningAction-wait.jsp</result>
       <result name="success">longRunningAction-success.jsp</result>
</action>
<%@ taglib prefix="s" uri="/struts" %>
<html>
     <head>
       <title>Please wait</title>
       <meta http-equiv="refresh" content="5;url=<a:url includeParams="all" />"/>
     </head>
     <body>
       Please wait while we process your request.
       Click <a href="<a:url includeParams="all" />"></a> if this page does not reload automatically.
     </body>
</html>
</pre>
<p/> <u>Example code2:</u>
This example will wait 2 second (2000 millis) before the wait page is shown to the user. Therefore
if the long process didn't last long anyway the user isn't shown a wait page.
<pre>
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="completeStack"/>
       <interceptor-ref name="execAndWait">
           <param name="delay">2000<param>
       <interceptor-ref>
       <result name="wait">longRunningAction-wait.jsp</result>
       <result name="success">longRunningAction-success.jsp</result>
</action>
</pre>
<p/> <u>Example code3:</u>
This example will wait 1 second (1000 millis) before the wait page is shown to the user.
And at every 50 millis this interceptor will check if the background process is done, if so
it will return before the 1 second has elapsed, and the user isn't shown a wait page.
<pre>
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="completeStack"/>
       <interceptor-ref name="execAndWait">
           <param name="delay">1000<param>
           <param name="delaySleepInterval">50<param>
       <interceptor-ref>
       <result name="wait">longRunningAction-wait.jsp</result>
       <result name="success">longRunningAction-success.jsp</result>
</action>
</pre>


Exception Interceptor
     拦截器组成了异常处理的核心特性.异常处理允许你映射一个异常到一个result code,像Action返回一个结果代码代替抛出的想不到的异常.当异常发生,它包装一个ExceptionHolder和放置到栈中.提供简单的访问异常从结果中.
注意:当你配置异常映射到你的配置文件.如果这个拦截器不在你的Action拦截器栈中配置将不会产生任何影响.建议你让拦截器是栈中的第一个拦截器,确保它能完全访问来捕获任何异常,甚至是由其它拦截器引起的异常.
参数
.logEnabled(可选)-异常是否被记录?(Boolean true|false)
.logLevel(可选)-什么日志级别将被使用(trace,debug,info,wrn,error,fatal)?默认为debug.
     .logCategory(可选)-如果使用这个category(eg.com.mycompany.app).默认使用com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.
上面的参数被开启我们记录所有抛出的异常在日志文件中,和显示一个友好的Web页面给终端用.
扩展拦截器
如果你想要添加自定义处理为公共的异常,你可以覆盖{@link #publishException(com.opensymphony.xwork2.ActionInvocation, ExceptionHolder)}.默认的实现放置给定的ExceptionHolder到值栈.一定制实现将被添加到日志等.
例子
<xwork>
       <package name="default" extends="xwork-default">
           <global-results>
               <result name="success" type="freemarker">error.ftl</result>
           </global-results>
           <global-exception-mappings>
               <exception-mapping exception="java.lang.Exception" result="error"/>
           </global-exception-mappings>
           <action name="test">
               <interceptor-ref name="exception"/>
               <interceptor-ref name="basicStack"/>
               <exception-mapping exception="com.acme.CustomException" result="custom_error"/>
               <result name="custom_error">custom_error.ftl</result>
               <result name="success" type="freemarker">test.ftl</result>
           </action>
       </package>
</xwork>


File Upload Interceptor
拦截器离开MultiPartRequestWrapper,将自动应用到任何请求到它包含的文件,添加下在的参数,[File Name]是通过HTML表单给定的上传文件名.
.[File Name]:File-实际文件
.[File Name]ContentType:String-内容类型文件
.[File Name]FileName:String-实际上传的文件名(不是HTML的名字)
你可以获取访问这些文件通过Action中提供的setter,关联到任何第三方模式上,像setDocument(File document), setDocumentContentType(String contentType),等.见例子中的代码片断.
这个拦截器将添加很多字段错误,假定Action实现ValidationAware.这些错误消息基于一些i18n值存储在struts-messages.properties中,一个默认的i18n处理为所有的i18n请求.你可以覆盖这些消息的文本通过提供的key对应用文本.
. struts.messages.error.uploading - a general error that occurs when the file could not be uploaded
.struts.messages.error.file.too.large - occurs when the uploaded file is too large
.struts.messages.error.content.type.not.allowed - occurs when the uploaded file does not match the expected content types specified
参数
.maximumSize(可选)-最大值(字节为单位)拦截器将允许一个文件引用设置到Action中,注意,这不会关联struts.properties中的常量属性.默认大约为2MB.
.allowedType(可选)-一个用逗号分隔的内容类型列表(例如:text/html),拦截器将允许一个文件引用设置到Action,如果指定为none允许所有类型的上传.

 

扩展拦截器
     你可以扩展这个拦截器和覆盖#acceptFile方法提供更多控制,支持的文件和不支持的文件.
例子
<action name="doUpload" class="com.examples.UploadAction">
       <interceptor-ref name="fileUpload"/>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>
</pre>
And then you need to set encoding <code>multipart/form-data</code> in the form where the user selects the file to upload.
<pre>
     <a:form action="doUpload" method="post" enctype="multipart/form-data">
         <a:file name="upload" label="File"/>
         <a:submit/>
     </a:form>
</pre>
And then in your action code you'll have access to the File object if you provide setters according to the
naming convention documented in the start.
<pre>
     public com.examples.UploadAction implemements Action {
         private File file;
         private String contentType;
         private String filename;
         public void setUpload(File file) {
            this.file = file;
         }
         public void setUploadContentType(String contentType) {
            this.contentType = contentType;
         }
         public void setUploadFileName(String filename) {
            this.filename = filename;
         }
         ...
}
</pre>
设置参数的例子:
<interceptor-ref name="fileUpload">
     <param name="allowedTypes">
        image/png,image/gif,image/jpeg
     </param>
</interceptor-ref>

I18n Interceptor
一个拦截器处理设置指定会话中的locale为当前的Action请求.另外,这个拦截器将查找指定的HTTP请求参数和设置locale使用提供的任何值.这意味着拦截器可以让你的应用程序动态的改变locale为用户的会话.这非常有用对应用程序想要支持多种语言和用户设置他或她的语言.locale参数被移除在拦截器执行期间,确保属性不被设置在Action上(像request_locale),不是特有的setter在Action中.
例如,使用默认的参数名,一个请示到foo.action?request_locale=en_US,locale美式英语被保存到用户的会话中并且将用于所有的后面请求中.
参数
.parameterName(可选)-HTTP请求的参数名,locale作为开关和保存会话中,默认为request_locale
.attributeName(可选)-session key的名字存储选中的locale.默认是WW_TRANS_I18N_LOCALE
扩展拦截器
这个拦截器没有扩展点
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="i18n"/>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>


Logger Interceptor
拦截器日志开始和结束Action的执行(仅英文,非国际化).
参数 这个拦截器没有参数.
扩展拦截器 没有明显的扩展到存在的拦截器.
例子
<!-- prints out a message before and after the immediate action execution -->
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="completeStack"/>
       <interceptor-ref name="logger"/>
       <result name="success">good_result.ftl</result>
</action>
<!-- prints out a message before any more interceptors continue and after they have finished -->
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="logger"/>
       <interceptor-ref name="completeStack"/>
       <result name="success">good_result.ftl</result>
</action>


Message Store Interceptor
一个拦截器存储ValidationAware Action的消息/错误和字段错误到Http Session,这样它将被重新获取在最后阶段.这允许Action的消息/错误和字段错误长期有效在特定的http请求.
在’STORE’模式中,拦截器将重新获取存储的Action 消息/错误和字段错误并且放他们到ValidationAware Action.
拦截器在’NONE’模式中什么也不做,其中一个是默认的.
操作模式可以被交换使用:
1]设置拦截器参数例子.
     <action name="submitApplication" ...>
        <interceptor-ref name="store">
           <param name="operationMode">STORE</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack" />
        ....
     </action>
2]通过请求参数(allowRequestParameterSwitch 必需为’true’,是默认的)
// the request will have the operation mode in 'STORE'
http://localhost:8080/context/submitApplication.action?operationMode=STORE
参数
. allowRequestParameterSwitch-开启请求参数可以交换拦截器的操作模式.
. requestParameterSwitch-指示拦截器中使用什么样的请求参数.
.operationMode-这个拦截器使用的操作模式(‘STORE’,’RETRIEVE’或’NONE’其中一个).’NONE’为默认.
扩展拦截器
下面的方法将被覆盖:
. getRequestOperationMode-获取拦截器的操作模式基于请求参数.
.mergeCollection-合并两个集合.
.mergeMap – 合并两个map
例子
<action name="submitApplication" ....>
      <interceptor-ref name="store">
        <param name="operationMode">STORE</param>
      </interceptor-ref>
      <interceptor-ref name="defaultStack" />
      <result name="input" type="redirect">applicationFailed.action</result>
      <result type="dispatcher">applicationSuccess.jsp</result>
</action>
<action name="applicationFailed" ....>
      <interceptor-ref name="store">
         <param name="operationMode">RETRIEVE</param>
      </interceptor-ref>
      <result>applicationFailed.jsp</result>
</action>

同上面的例子, 'submitApplication.action'有Action消息/错误/字段错误存储到Http会话中.以后需要的时候,在这种情况下,’applicationFailed.action’被激活,它将获取Action 消息/错误/字段错误存储在HTTP会话中并且放回到Action.

Model Driven Interceptor
     查看ModelDriven Action和添加Action的模型到值栈.
注意: ModelDrivenInterceptor必需出现在StaticParametersInterceptor和ParametersInterceptor之前,如果你想要参数被应用到模型.
注意: ModelDrivenInterceptor将仅放模型到栈当模型不为null,其它的的将被忽略.
参数 None
扩展拦截器 这个拦截器没有扩展点.
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="model-driven"/>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>


Scoped Model Driven Interceptor
     一个开授权给范围模型驱动的Action的拦截器.
这个拦截器仅激活实现ScopeModelDriven接口的Action.如果被检查到.,它将重新获取模型类从配置范围内,这样提共它到Action.
参数
.calssName-模型类的名字.默认为通过getModel()方法返回的对象的类名.
.name-关键字用来使用当存储或重获实例在一个范围内。默认为模型类名.
.scope-存储或重获模型的范围.默认为’request’也可以是’session’.
扩展拦截器 此拦截器无扩展点
例子
<-- Basic usage -->
<interceptor name="scoped-model-driven" class="com.opensymphony.interceptor.ScopedModelDrivenInterceptor" />
<-- Using all available parameters -->
<interceptor name="gangsterForm" class="com.opensymphony.interceptor.ScopedModelDrivenInterceptor">
        <param name="scope">session</param>
        <param name="name">gangsterForm</param>
        <param name="className">com.opensymphony.example.GangsterForm</param>
</interceptor>


Servlet Config Interceptor
一个拦截器设置Action属性基于接口实现的Action。例如,如果Action实现ParameterAware那么Action上下文的参数映射将会被设置.
     这个拦截器设计来设置一有的属性,一个Action需要知道Servlet参数,servlet上下文,会话等等.接口支持:
ServletContextAware
ServletRequestAware
ServletResponseAware
ParameterAware
RequestAware
SessionAware
ApplicationAware
PrincipalAware
参数     无
扩展拦截器      此拦截器无扩展点。
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="servlet-config"/>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>


Static Parameters Interceptor
这个拦截器位于静态参数定义的Action配置文件中.如果Action实现Parameterizable,静态参数映射的Map将会被直接传递到Action.
参数典型的定义在<param>元素内存在于xwork.xml文件中.
参数 None
扩展拦截器     这个拦截器没有扩展点.
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="static-params">
            <param name="parse">true</param>
       </interceptor-ref>
       <result name="success">good_result.ftl</result>
</action>

Roles Interceptor
     它被执行仅当用户有正确的角色.

Timer Interceptor
这个拦截器记录时间单位为毫秒.为了使这个拦截器正常的工作,日志框架必需被设置,至少是INFO级别.这个拦截器依赖于Commons Logging API 报告执行时间值.
参数
.logLevel(可选的)-我们使用什么日志级别(trace,debug,info,warn,error,fatal)? –默认为info
.logCategory(可选的)-假如我们使用这个类别(eg.com.mycompany.app).默认使用com.opensymphony.xwork2.interceptor.TimerInterceptor.
开启上面的参数我们记录所有的Action执行期间的日志到日志文件中.
扩展拦截器
这个拦截器可以被扩展提供定制的消息格式.用户可以覆盖invokeUnderTiming方法.
例子
<!-- records only the action's execution time -->
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="completeStack"/>
       <interceptor-ref name="timer"/>
       <result name="success">good_result.ftl</result>
</action>
<!-- records action's execution time as well as other interceptors-->
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="timer"/>
       <interceptor-ref name="completeStack"/>
       <result name="success">good_result.ftl</result>
</action>

Token Interceptor
确保仅有一个请求每个标记被处理.这个拦截器可以确保回退按钮和双击不会引起非预想到的影响.例如,你可以使用它来阻止粗心的用户双击一个”check out”按钮在一个在线商店中.这个拦截器使用一个完全原始的支术当一个无效的标记被找到;它将返回结果invalid.token,它可以被映射到你的Action配置中.一个更复杂的实现, TokenSessionStoreInterceptor,可以提供更好的逻辑当无效的标记被找到.
注意:设置一个token在你的表单中,你必需使用token标签.这个标签要求并且必需用于表单中,提交到Action保护通过这个拦截器.一些请求不提供token(使用token标签)将会被处理做为一个无效的token请求.
国际化注意事项:下面的key可以用于国际化Action错误生成通过这个token拦截器.
     . struts.messages.invalid.token
注意:当这个方法离开MethodFilterInterceptor扩展时,它有能力决定选择Action中的方法,见MethodFilterInterceptor获取更多的信息.
参数 None
扩展拦截器
      用户不经常扩展它,这个拦截器扩展通过TokenSessionStoreInterceptor. handleInvalidToken和handleValidToken方法保护和可用更多有趣的逻辑,像做token会话拦截.
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="token"/>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>
<-- In this case, myMethod of the action class will not
          get checked for invalidity of token -->
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="token">
          <param name="excludeMethods">myMethod</param>
       </interceptor-ref name="token"/>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>

Token Session Interceptor
拦截器不是从TokenInterceptor构建,提供先进的逻辑处理无效的token.不像普通token拦截器,这个拦截器将尝试提供智能的失败处理在多个请求事件请求使用相同的会话.那样,它将阻碍后面的请求,直到前一个请求完成,并且代替换返回invalid.token代码,它将尝试显示相同的原始资源,如果没有多个请求被提交在第一个地方,验证Action调用将会显示.
注意:像远离MethodFilterInterceptor方法,它能决定是仅选择适当的方法在Action类中,见来MethodFilterInterceptor获取更多的信息.
参数 None
扩展拦截器 这个拦截器没有扩展点.
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="token-session/>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>
<-- In this case, myMethod of the action class will not
          get checked for invalidity of token -->
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="token-session>
           <param name="excludeMethods">myMethod</param>
       </interceptor-ref name="token-session>
       <interceptor-ref name="basicStack"/>
       <result name="success">good_result.ftl</result>
</action>

Validation Interceptor
这个拦截器运行Action通过标准的验证框架,轮流检查针对其它的验证规则(查找文件像ActionClass-validation.xml)和添加字段级和Action级错误消息(提供通过Action实现com.opensymphony.xwork2.ValidationAware),这个拦截器通常是最后一个(或仅次于最后一个)应用到栈中的拦截器,同样的假定所有的值已经被设置到Action.
     如果方法名被调用指定在excludeMethods参数,拦截器什么也不做.excludeMethods接收一个逗号分隔的方法名列表.例如,请求foo!input.action和foo!back.action将会被跳过通过这个拦截器,如果你设置excludeMethods参数到”input,back”.
注意什么也不用做使用com.opensymphony.xwork2.Validateable接口并且简单的添加错误消息到Action.Action请求的流程不会改变原有的拦截器.宁原这个拦截器常常在conjuction同workflow拦截器使用.
注意:因为这个方法不是从MethodFilterInterceptor继承, 它能决定是仅选择适当的方法在Action类中,见来MethodFilterInterceptor获取更多的信息.
参数 None
扩展拦截器 这个拦截器无扩展点
例子
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="params"/>
       <interceptor-ref name="validation"/>
       <interceptor-ref name="workflow"/>
       <result name="success">good_result.ftl</result>
</action>
<-- in the following case myMethod of the action class will not
          get validated -->
<action name="someAction" class="com.examples.SomeAction">
       <interceptor-ref name="params"/>
       <interceptor-ref name="validation">
           <param name="excludeMethods">myMethod</param>
       </interceptor-ref>
       <interceptor-ref name="workflow"/>
       <result name="success">good_result.ftl</result>
</action>

你可能感兴趣的:(Structs2拦截器详解)