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

Java Struts2拦截器参数及其生命周期,java,parameters,struts2,lifecycle,interceptor,Java,Parameters,Struts2,Lifecycle,Interceptor,我们在代码中使用Struts2,我有一个场景需要向拦截器添加自定义参数。 我在拦截器中定义了setter和getter public Collection<Class<?>> getGroups(); public void setGroups(String groupsString); public Collection是和否。拦截器类似于servlet——拦截器只有一个实例。* 但是,请注意,在您当前的定义中,只有“loginRequired”拦截器定义在该操作上—

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

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

public Collection是和否。拦截器类似于servlet——拦截器只有一个实例。*

但是,请注意,在您当前的定义中,只有“loginRequired”拦截器定义在该操作上——其他框架拦截器都不会运行。如果在操作上声明
,则必须定义所有拦截器

从配置来看,您似乎在试图定义哪些组可以访问某个操作:该信息应该存储在操作中,而不是侦听器中,因为正在检测的是该操作

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

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


*每拦截器参考,实际上;一个拦截器可以有多个实例,但只有在堆栈声明中显式引用时,即使如此,在流经该堆栈的请求之间,只有一个侦听器实例被共享。

loginRequired是一个包含beanValidatorInterceptor*的堆栈,因此如果我在每个操作上引用一个堆栈,则每个操作都有一个堆栈实例。2个动作,2个堆栈实例(每个拦截器都已定义)@szympans正确。但我相信行动特定的数据应该在行动中,而不是拦截器,这也简化/减少了配置。好的,我会考虑你的建议。我喜欢MethodFilterInterceptor的工作方式。。。谢谢你的帮助clarification@szympans我会考虑方法级别注释或基于名称的方法约定。例如,对于方法,可以有一个名为executeAccess的方法来定义execute方法的访问权限。拦截器将查看调用的是什么方法,查看是否有相应的访问方法,如果有,则调用它。
<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>