我们在代码中使用 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())。调用拦截器并设置 includeMethods。
- 问题:您知道什么是拦截器生命周期吗?在操作级别设置 includeMethods 和组是否安全。换句话说, Action 共享相同的堆栈,但需要传递不同的参数
最佳答案
是和否。拦截器就像 servlet——拦截器只有一个实例。*
但请注意,根据您当前的定义,仅在该操作上定义了“loginRequired”拦截器,不会运行任何其他框架拦截器。如果您声明 <interceptor-ref>
对于某个操作,您必须定义所有拦截器。
从配置来看,您似乎正在尝试定义哪些组可以访问某个操作:该信息应该存储在操作中,而不是拦截器中,因为它是正在执行的操作仪器化。
您有多种选择。您可以使用“staticParams”拦截器来设置操作的信息,您可以定义和实现操作的接口(interface)并包含检索该操作的权限的方法,或者在操作上使用注释并询问操作和/或拦截器内的操作方法。
IMO 拦截器应该是通用的,并且不接收这些类型的参数:您正在向拦截器添加操作元数据。相反,将操作元数据添加到操作中,并使用拦截器对该元数据进行操作。
*实际上,每个拦截器引用;拦截器可以有多个实例,但仅当在堆栈声明中显式引用时才有效,即使如此,流经该堆栈的请求之间也只会共享一个拦截器实例。
关于java - Struts2拦截器参数及其生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081052/