Struts 2:根命名空间的作用与默认命名空间相同

发布于 2024-12-27 09:42:07 字数 1607 浏览 0 评论 0原文

在 Struts 2 中,我看到根命名空间提供与根命名空间相同的行为,即充当“catch all”。我需要限制应用程序中的操作只能从一个 URL 访问,包括 URL 中没有命名空间的操作。我的理解是使用根命名空间应该做到这一点,但我还没有看到它起作用。

我可以使用 Struts 2 教程的 Eclipse 的 HelloWorld 示例重现此问题 这里

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 失败,并显示 “没有为命名空间/和操作名称索引映射的操作。”
  • 本地主机:8080/Basic_Struts2_Ant/foo/index.action 显示 index.jsp

也不错。

现在,如果我将 struts xml 更改为

<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 工作?

In Struts 2 I am seeing the root namespace giving the same behaviour as the root namespace, ie acting as a "catch all". I need to restrict actions in my app to be accessible from only one URL, including those without a namespace in the URL. My understanding is using root namespace should do this but I haven't seen it work.

I can reproduce this problem with the Struts 2 tutorial's HelloWorld example for Eclipse available here.

The struts.xml contains

<package name="basicstruts2" extends="struts-default">
    ...
    <action name="index">
        <result>/index.jsp</result>
    </action>
    ...
</package>

So both the following links show the index.jsp result

  • localhost:8080/Basic_Struts2_Ant/index.action
  • localhost:8080/Basic_Struts2_Ant/foo/index.action

Good so far.

If I change the struts.xml to

<package name="basicstruts2" namespace="/foo" extends="struts-default">
  • localhost:8080/Basic_Struts2_Ant/index.action fails with
    "There is no Action mapped for namespace / and action name index."
  • localhost:8080/Basic_Struts2_Ant/foo/index.action shows
    index.jsp

Also good.

Now if I change struts xml to say

<package name="basicstruts2" namespace="/" extends="struts-default">

Both the following links show the index.jsp result (same as when no namespace is defined)

  • localhost:8080/Basic_Struts2_Ant/index.action
  • localhost:8080/Basic_Struts2_Ant/foo/index.action

If I have understood the namespace documentation correctly I would expect
localhost:8080/Basic_Struts2_Ant/foo/index.action to fail with "There is no Action mapped for namespace /foo and action name index."

I have also tried other variants, replacing "foo" with "alksdja" etc, to eliminate browser caching as a possibility.

Have I misunderstood what the root namespace does? And how to disable /foo/index.action from working while allowing /index.action?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

秋叶绚丽 2025-01-03 09:42:07

您需要定义默认包和根包。
逻辑是,如果在您的包中找不到某些操作,则哪个名称空间是
"/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>

You need to define both default package and root package.
The Logic is , if some action can not be found in your package which namespace is
"/foo" , struts2 will search the same action name in default package.
If default package not exist, it will search root package.
So what you need is define both default package and root package.

<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>
ぶ宁プ宁ぶ 2025-01-03 09:42:07

我也面临同样的情况。我通过定义默认命名空间和根命名空间进行了测试。它的工作原理如下:如果在指定的命名空间中找不到操作,则首先搜索根命名空间,只有在该操作在根命名空间中不存在后才搜索默认命名空间。和我读过的struts2文档不一样。可能是因为struts2版本?我用的是struts 2.3.16。

I faced the same. I have tested by defining both default and root namespace. It works like: If action cannot be found with the specified namespace it search root namespace first and search default namespace only after that action does not exit in the root namespace. It is different from struts2 documentation I have read. It may be coz of struts2 version? I used struts 2.3.16.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文