Struts2技术实现:将URL中的Action名称替换为别名
嘿,这个需求在Struts2里实现起来很直接,核心就是利用框架的Action别名映射机制,完全可以把晦涩的真实Action名称替换成友好的别名,下面给你两种实用的方案:
方案1:直接配置单个Action别名
这是最直观的方式,直接在struts.xml里为你的真实Action指定别名。比如你的真实Action类是BillingPayment_Action,想要对外暴露的别名是PleasePayyourBill,配置如下:
<struts> <!-- 对应你的TestPackage命名空间 --> <package name="TestPackage" namespace="/TestPackage" extends="struts-default"> <!-- 别名Action配置:name是对外展示的URL路径,class指向真实的Action类全限定名 --> <action name="PleasePayyourBill" class="com.yourproject.TestPackage.BillingPayment_Action"> <!-- 保留原Action的result跳转配置,和原来完全一致 --> <result name="success">/pages/paymentSuccess.jsp</result> <result name="error">/pages/paymentError.jsp</result> </action> </package> </struts>
配置完成后,用户访问www.Test.com/TestPackage/PleasePayyourBill时,Struts2会自动调度到BillingPayment_Action执行逻辑,真实Action名称完全不会暴露在URL里。
方案2:批量禁用真实Action路径(增强安全性)
为了彻底防止用户猜测到真实Action名称,你可以额外配置全局规则,禁止直接访问所有带_Action后缀的路径。在struts.xml里添加以下常量配置:
<struts> <!-- 禁止访问所有以_Action结尾的Action路径 --> <constant name="struts.action.excludePattern" value="/TestPackage/*_Action"/> <!-- 上面的别名配置依然保留 --> <package name="TestPackage" namespace="/TestPackage" extends="struts-default"> <action name="PleasePayyourBill" class="com.yourproject.TestPackage.BillingPayment_Action"> <result name="success">/pages/paymentSuccess.jsp</result> <result name="error">/pages/paymentError.jsp</result> </action> </package> </struts>
这样一来,如果有人尝试直接访问www.Test.com/TestPackage/BillingPayment_Action,会被框架拦截,返回404或者自定义错误页面,进一步保障了后端Action的隐蔽性。
注意事项
- 确保
class属性填写的是真实Action类的全限定名(包名+类名),不然框架找不到对应的Action类 - 如果有多个Action需要别名,重复方案1的配置即可,每个别名对应一个真实Action
- 测试时记得重启Web应用,让配置生效
内容的提问来源于stack exchange,提问作者Riaz
相关产品推荐
相关产品推荐

