首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Struts 2 動態方法調用三種方式詳解:配置屬性、感嘆號、通配符最佳實踐

     編輯:Java 綜合教學

場景

單個 Action 類包含多個業務方法(add/update/delete/list),需根據請求路由到不同方法,避免編寫大量重複 <action> 配置。

方式一:method 屬性顯式映射(最原始、最繁瑣)

<package name="user" extends="struts-default">
    <action name="userAdd" class="com.demo.UserAction" method="add">
        <result name="success">/user/add.jsp</result>
    </action>
    <action name="userUpdate" class="com.demo.UserAction" method="update">
        <result name="success">/user/update.jsp</result>
    </action>
    <action name="userDelete" class="com.demo.UserAction" method="delete">
        <result name="success">/user/list.jsp</result>
    </action>
</package>

缺點:方法增加需同步修改 XML,維護成本高。

方式二:感嘆號 (!) 動態調用(官方不推薦,安全風險)

<!-- struts.xml 啟用開關 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />

<action name="userAction" class="com.demo.UserAction">
    <result name="add">/user/add.jsp</result>
    <result name="update">/user/update.jsp</result>
</action>
<!-- JSP 鏈接 -->
<a href="userAction!add">新增</a>
<a href="userAction!update">修改</a>
// Action
public class UserAction extends ActionSupport {
    public String add() { return "add"; }
    public String update() { return "update"; }
}

風險:任意公共方法可被 URL 直接調用,暴露內部邏輯,易遭惡意調用。Struts 2.5+ 默認關閉,強烈建議不用。

方式三:通配符映射(官方推薦,約定優於配置)

<action name="user*Action" class="com.demo.UserAction" method="{1}">
    <result name="add">/user/add.jsp</result>
    <result name="update">/user/update.jsp</result>
    <result name="delete">/user/list.jsp</result>
    <result name="list">/user/list.jsp</result>
</action>
<!-- JSP -->
<a href="userAddAction">新增</a>
<a href="userUpdateAction">修改</a>
<a href="userDeleteAction">刪除</a>
<a href="userListAction">列表</a>

原理:* 匹配任意字符,{1} 引用第一個分組內容作為方法名。支持多通配符 user*_*Action → method="{1}_{2}"。

進階技巧:動態結果映射

<action name="user*Action" class="com.demo.UserAction" method="{1}">
    <result name="{1}">/user/{1}.jsp</result>  <!-- 方法名直接對應視圖 -->
</action>

配合 struts.convention.result.path 進一步簡化。

安全加固建議

  1. 禁用 struts.enable.DynamicMethodInvocation(默認 false)。
  2. Action 方法訪問修飾符設為 public 僅限業務方法,內部輔助方法用 private/protected。
  3. 使用 MethodPrefixInterceptor 或自定義攔截器白名單校驗方法名。
  4. 升級 Struts 2.5.28+,修復歷史 OGNL/RCE 漏洞。

總結對比

方式配置量安全性維護性推薦度
method 屬性大高低★☆☆
感嘆號小低中★☆☆ (禁用)
通配符極小高高★★★ (首選)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved