在 Struts 2 中,我看到根命名空间提供与根命名空间相同的行为,即充当“包罗万象”。我需要限制我的应用程序中的操作只能从一个 URL 访问,包括 URL 中没有 namespace 的操作。我的理解是使用根命名空间应该可以做到这一点,但我还没有看到它起作用。
我可以使用 Struts 2 教程的 Eclipse 的 HelloWorld 示例重现此问题 here .
struts.xml包含
<package name="basicstruts2" extends="struts-default">
...
<action name="index">
<result>/index.jsp</result>
</action>
...
</package>
因此以下两个链接都显示了 index.jsp 结果
- localhost:8080/Basic_Struts2_Ant/index.action
- localhost:8080/Basic_Struts2_Ant/foo/index.action
到目前为止还不错。
如果我将 struts.xml 更改为
<package name="basicstruts2" namespace="/foo" extends="struts-default">
- localhost:8080/Basic_Struts2_Ant/index.action 失败并显示 “没有为命名空间/和操作名称索引映射的操作。”
- localhost:8080/Basic_Struts2_Ant/foo/index.action 显示 索引.jsp
也不错。
现在,如果我将 struts xml 更改为 say
<package name="basicstruts2" namespace="/" extends="struts-default">
以下两个链接都显示了 index.jsp 结果(与未定义命名空间时相同)
- localhost:8080/Basic_Struts2_Ant/index.action
- localhost:8080/Basic_Struts2_Ant/foo/index.action
如果我正确理解命名空间文档,我会期望 localhost:8080/Basic_Struts2_Ant/foo/index.action 失败并显示“没有为命名空间/foo 和操作名称索引映射的操作。”
我还尝试了其他变体,将“foo”替换为“alksdja”等,以消除浏览器缓存的可能性。
我是不是误解了根命名空间的作用?以及如何在允许/index.action 的同时禁用/foo/index.action?
最佳答案
您需要同时定义默认包和根包。 逻辑是,如果在您的包中找不到某些操作,则命名空间是 "/foo", struts2 将在默认包中搜索相同的 Action 名称。 如果默认包不存在,它将搜索根包。 因此,您需要定义默认包和根包。
<package name="basicstruts2_default" extends="struts-default">
<!--put actions that share in all namespace and global settings-->
</package>
<package name="basicstruts2_root" namespace="/" extends="basicstruts2_default">
<action name="index">
<result>/index.jsp</result>
</action>
</package>
<package name="basicstruts2_foo" namespace="/foo" extends="basicstruts2_default">
<action name="show">
<result>/foo/show.jsp</result>
</action>
</package>
关于namespaces - 支柱 2 : root namespace acting same as default namespace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8881867/