Struts 2 Bad Practices: Dynamic Method Invocation (struts2 动态方法调用)

简介:

Struts 2 是一款基于 MVC 模式的 Web 应用程序框架,它使用了拦截器(Interceptor)和动态方法调用(DMI,Dynamic Method Invocation)等特性来实现请求的处理和响应。

DMI 是 Struts 2 的一项特性,它允许将请求参数直接映射到 Action 类中的方法,并在执行时动态调用这些方法。例如,如果一个请求提交了参数 methodName=save,那么 Struts 2 就会自动寻找名为 "save" 的方法,并调用它。这种方式的优点是简化了代码和配置,可以减少很多冗余的代码和配置文件。但是,由于 DMI 具有潜在的安全风险和代码难以维护等问题,因此在 Struts 2 中被认为是一种不良实践。

下面列举几个 DMI 带来的问题:

  1. 安全问题:DMI 的一个风险是可能会被黑客利用,构造恶意请求来调用 Action 类中的私有方法或其他不应该被调用的方法。
  2. 难以维护:使用 DMI 可能会导致代码难以阅读和维护,因为方法名称是在运行时动态解析的,无法进行编译时检查。这也使得代码容易出错,调试起来更加困难。
  3. 可扩展性差:使用 DMI 还会减弱应用程序的可扩展性,因为无法在编译时静态绑定方法调用。这样一来,我们需要在运行时才能知道方法是否存在,导致应用难以修改和升级。

为避免以上问题,Struts 2 框架推荐使用静态方法调用的方式来处理请求。虽然这种方式相对繁琐,但是可以提高代码的安全性、可维护性和可扩展性。如果需要使用 DMI,可以通过进行严格的输入验证和使用安全漏洞扫描工具等方法来降低潜在的安全风险。

在 Struts 2 中,Action 类是实现请求处理逻辑的主要组件,它负责接收请求、处理请求,并返回响应数据。因此,Action 类中包含了很多公共方法,用于对请求进行处理和生成响应。

以下是 Struts 2 Action 类中常见的公共方法:

  1. public String execute() throws Exception: 执行 Action 处理逻辑的方法,通常是 Struts 2 的默认配置。如果没有定义自己的方法名,则会调用该方法。
  2. public String methodName() throws Exception: 根据请求中的方法名来执行相应的方法。通过在请求中传递 methodName 参数来指定具体的方法。
  3. public void validate(): 用于对表单输入数据进行验证的方法,可以对输入数据进行必要的校验和转换。
  4. public String input() throws Exception: 输入方法,当校验失败时,将调用该方法重新显示表单。
  5. public String login() throws Exception: 登录方法,处理用户登录请求并返回登录结果。
  6. public String logout() throws Exception: 登出方法,处理用户登出请求并返回登出结果。
  7. public String executeAjax() throws Exception:执行 Ajax 请求处理逻辑的方法,通常会返回 JSON 数据格式。

除此之外,我们还可以自定义 Action 方法来实现特定的业务逻辑,例如保存数据、查询数据、删除数据等操作。这些方法可以被请求参数所指定,通过在请求中传递方法名参数来触发相应的方法执行。

posted @ 2023-04-18 15:47  不聪明的小子  阅读(39)  评论(0编辑  收藏  举报