使用 struts2-convention-plugin 時,Action 類 action.a.b.LoginAction 預設映射到 /a/b/login.action,但實測發現 /login、/xxx/xxxx/login 等路徑皆可訪問,且想將結果頁指向 WEB-INF/content/a/b/login-success.jsp。
action.a.b → /a/b/Action 後缀 → Action 名:LoginAction → loginWEB-INF/content/a/b/login-success.jsp(對應 success 結果)Convention 插件採用 命名空間前綴匹配,只要尾部符合 /login 即會路由到該 Action,導致 /xxx/login 也命中。
在 struts.xml 設定嚴格命名空間:
<constant name="struts.convention.action.suffix" value="Action"/>
<constant name="struts.convention.action.mapAllMatches" value="false"/>
<constant name="struts.convention.default.parent.package" value="convention-default"/>
使用註解精確控制:
@Namespace("/a/b")
@Action(value = "login", results = {
@Result(name = "success", location = "/WEB-INF/content/a/b/login-success.jsp")
})
public class LoginAction extends ActionSupport { ... }
或在 struts.xml 覆寫:
<package name="custom" extends="convention-default">
<action name="login" class="action.a.b.LoginAction">
<result name="success">/WEB-INF/content/a/b/login-success.jsp</result>
</action>
</package>