关于拦截器配置的基本信息
概况
拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可重用的部分的方式.
拦截器必须是无状态的,不能保证为每一个请求或者action创建一个实例.拦截器可以选择短路一个action调用,然后返回一个结果码(如com.opensymphony.xwork.Action#SUCCESS);也可以选择在ActionInvocation#invoke()之前或者之后做一些处理。
Webwork & XWork Interceptors
拦截器以key-value对的方式定义在xwork配置文件中.下面是定义在webwork-default.xml的拦截器.如果您扩展webwork-default包,您就可以使用下面的拦截器.否则您就必须在自己的包中的<interceptors>标签中定义name-class对.
方法过滤
抽象的拦截器可以通过指定included/excluded方法列表来实现可选择性
可以设置的参数如下:
- excludeMethods - 被排除的方法
- includeMethods - 被包含的方法
注意: 如果一个方法的名字同时出现在includeMethods和includeMethods里,它会被当作包含的方法。也就是,includeMethods优先于excludeMethods.
扩展了这一能力的拦截器有:
- TokenInterceptor
- TokenSessionStoreInterceptor
- DefaultWorkflowInterceptor
- ValidationInterceptor
拦截器参数覆盖
拦截器的参数可以通过如下方式被覆盖
方法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="validator.excludeMethods">myValidationExcludeMethod</param>
<param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>
</interceptor-ref>
</action>
在第一个方法中,整个默认栈都被复制,然后根据需要改变参数。
在第二个方法中,我们引用了已经存在的拦截器栈。在这个例子中这个栈是default-stack,然后覆盖了validator和workflow拦截器的excludeMethods参数。注意在这个标签的name属性中有一个点(.),点之前的单词表示要被覆盖参数的拦截器名,点之后的表示参数。形式如下:
也要注意到,在这个例子中如果name属性用来表示一个拦截器栈,就像指向一个拦截器本身,那只能用上面描述的第一种方法.
拦截器执行顺序
拦截器提供了极好的方式去包装 前/后 处理.这种概念减少了代码重复(就像AOP).
<interceptor-stack name="xaStack">
<interceptor-ref name="thisWillRunFirstInterceptor"/>
<interceptor-ref name="thisWillRunNextInterceptor"/>
<interceptor-ref name="followedByThisInterceptor"/>
<interceptor-ref name="thisWillRunLastInterceptor"/>
</interceptor-stack>
注意一些拦截器会打乱stack/chain/flow...所以顺序非常重要.
实现了com.opensymphony.xwork.interceptor.PreResultListener的拦截器在Action之后Result之前执行.
executesthisWillRunFirstInterceptor
thisWillRunNextInterceptor
followedByThisInterceptor
thisWillRunLastInterceptor
MyAction1
MyAction2 (chain)
MyPreResultListener
MyResult (result)
thisWillRunLastInterceptor
followedByThisInterceptor
thisWillRunNextInterceptor
thisWillRunFirstInterceptor