Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.4.6 拦截器配置

拦截器其实就是AOP(面向切面编程)的编程思想。拦截器允许在Action处理之前,或者在Action处理结束之后,插入开发者自定义的代码。

在很多时候,我们需要在多个 Action 中进行相同的操作,例如权限控制,此处就可以使用拦截器来检查用户是否登录、用户的权限是否足够(当然也可以借助Spring的AOP框架来完成)。通常,使用拦截器可以完成如下操作。

进行权限控制(检查浏览者是否是登录用户,并且是否有足够的访问权限)。

跟踪日志(记录每个浏览者所请求的每个Action)。

跟踪系统的性能瓶颈(我们可以通过记录每个Action的开始处理时间和结束处理时间,从而取得耗时较长的Action)。

Struts 2也允许将多个拦截器组合在一起,形成一个拦截器栈。一个拦截器栈可以包含多个拦截器,多个拦截器组成一个拦截器栈。对于Struts 2系统而言,多个拦截器组成的拦截器栈对外也表现为一个拦截器。

提示:

可以认为多个拦截器组成的拦截器栈是一个大的拦截器。Struts 2推荐定义多个小粒度的拦截器,然后组合成拦截器栈来完成复杂的功能,而不是直接定义大粒度的拦截器。一个小粒度的拦截器,可以与其他不同的拦截器组成不同的拦截器栈,从而提供更好的复用性。

在定义拦截器栈之前,必须先定义组成拦截器栈的多个拦截器。从功能上看,拦截器栈的实质就是大拦截器,因此 Struts 2 把拦截器栈当成拦截器处理,拦截器和拦截器栈都放在<interceptors.../>元素中定义。

下面是拦截器的定义片段。

<interceptors>
    <!-- 定义权限检查的拦截器 -->
    <interceptor name="authority" class="lee.AuthorityInterceptor"/>
    <!-- 定义日志记录的拦截器 -->
    <interceptor name="log" class="lee.LogInterceptor"/>
    <!-- 定义一个拦截器栈 -->
    <interceptor-stack name="authorityandlog">
          <!-- 定义该拦截器栈包含authority拦截器 -->
          <interceptor-ref name="authority"/>
          <!-- 定义该拦截器栈包含log拦截器 -->
          <interceptor-ref name="log"/>
    </interceptor-stack>
</interceptors>

在上面的拦截器配置片段中,定义了两个拦截器,并将两个拦截器组成一个拦截器栈。一旦定义了拦截器和拦截器栈之后,在Action中使用拦截器或拦截器栈的方式是相同的。

<action name="MyAction" class="lee.MyAction">
    <result name="success">...</result>
    <interceptor-ref name="authorityandlog"/>
</action>

在上面的配置片段中定义了一个名为MyAction的Action,并在该Action内引用了一个名为 authorityandlog 的拦截器栈。对于 Action 而言,引用拦截器和引用拦截器栈的用法是完全一样的。

提示:

关于拦截器更详细的用法,请参考本书的第9章。