我们在代码中使用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>
我有一个问题和一个问题
答案 0 :(得分:1)
是和否。拦截器就像servlet - 只有一个拦截器实例。*
但请注意,对于您当前的定义,仅在该操作上定义了“loginRequired”拦截器 - 将运行其他框架拦截器的 none 。如果您对某个操作声明<interceptor-ref>
,则必须定义 all 拦截器。
从配置中看起来好像你正试图定义哪个组可以访问一个动作:该信息应该存储在动作中,而不是拦截器中,因为它是正在进行的动作仪器
您有几种选择。您可以使用“staticParams”拦截器来设置操作的信息,您可以在操作上定义和实现一个接口,并包含一个方法来检索该操作的权限,或者对操作使用注释并查询操作和/拦截器内的动作方法。
IMO拦截器应该是通用的,不会接收这些类型的参数:您正在向拦截器添加操作元数据。而是将操作元数据添加到操作中,并使用拦截器对该元数据进行操作。
*每个interceptor-ref,实际上;可以有多个拦截器实例,但只有在堆栈声明中显式引用时,即使这样,在流经该堆栈的请求之间也只会共享一个拦截器实例。