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

标签 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())。调用拦截器并设置 includeMethods。
  • 问题:您知道什么是拦截器生命周期吗?在操作级别设置 includeMethods 和组是否安全。换句话说, Action 共享相同的堆栈,但需要传递不同的参数

最佳答案

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

但请注意,根据您当前的定义,在该操作上定义了“loginRequired”拦截器,不会运行任何其他框架拦截器。如果您声明 <interceptor-ref>对于某个操作,您必须定义所有拦截器。

从配置来看,您似乎正在尝试定义哪些组可以访问某个操作:该信息应该存储在操作中,而不是拦截器中,因为它是正在执行的操作仪器化。

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

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

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

关于java - Struts2拦截器参数及其生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081052/

相关文章:

java - 通过 Android 上的 TCP 套接字流式传输音频

c++ - int argc, char *argv[] 是什么意思?

ios - 如何在 Swift 中传递带有未知参数并返回值作为参数的函数

java - Struts 2制作动态参数

java - 按字段生成 Spring Data JPA 查询

java - 在tomcat上部署Servlet时出现404问题

java - 如何读取 XML 中的特定标签

java - Struts 渲染我的表格错误

java - 批量从 Redis 中获取数据 RedisTemplate

linux - 检查参数是值 X 还是值 Y