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章。