Struts2拦截器参数及其生命周期

时间:2011-11-10 14:29:25

标签: java parameters struts2 lifecycle interceptor

我们在代码中使用Struts2,我需要在拦截器中添加自定义参数。 我在拦截器中定义了setter和getter

public Collection<Class<?>> getGroups();
public void setGroups(String groupsString);

我在堆栈中定义了拦截器:

<interceptor-ref name="beanValidatorInterceptor">
    <param name="excludeMethods">*</param>
</interceptor-ref>

我正在行动级别设置其他参数

<action name="...">
  <interceptor-ref name="loginRequired">
    <param name="beanValidatorInterceptor.includeMethods">execute</param>
    <param name="beanValidatorInterceptor.groups">com.company.MyGroup</param>
  </interceptor-ref>
  <result>some.jsp</result>
</action>

我有一个问题和一个问题

  • 问题:未设置组参数(未调用setGroups())。调用Interceptor并设置includeMethods。
  • 问题:你碰巧知道什么是拦截器生命周期。在操作级别设置includeMethods和组是否安全。换句话说,动作共享相同的堆栈但需要传递不同的参数

1 个答案:

答案 0 :(得分:1)

是和否。拦截器就像servlet - 只有一个拦截器实例。*

但请注意,对于您当前的定义,在该操作上定义了“loginRequired”拦截器 - 将运行其他框架拦截器的 none 。如果您对某个操作声明<interceptor-ref>,则必须定义 all 拦截器。

从配置中看起来好像你正试图定义哪个组可以访问一个动作:该信息应该存储在动作中,而不是拦截器中,因为它是正在进行的动作仪器

您有几种选择。您可以使用“staticParams”拦截器来设置操作的信息,您可以在操作上定义和实现一个接口,并包含一个方法来检索该操作的权限,或者对操作使用注释并查询操作和/拦截器内的动作方法。

IMO拦截器应该是通用的,不会接收这些类型的参数:您正在向拦截器添加操作元数据。而是将操作元数据添加到操作中,并使用拦截器对该元数据进行操作。

*每个interceptor-ref,实际上;可以有多个拦截器实例,但只有在堆栈声明中显式引用时,即使这样,在流经该堆栈的请求之间也只会共享一个拦截器实例。