Struts 2: корневое пространство имен действует так же, как пространство имен по умолчанию - PullRequest
3 голосов
/ 16 января 2012

В Struts 2 я вижу, как корневое пространство имен действует так же, как корневое пространство имен, то есть действует как «перехватить все».Мне нужно ограничить действия в моем приложении, чтобы они были доступны только с одного URL-адреса, включая действия без пространства имен в URL-адресе.Насколько я понимаю, использование корневого пространства имен должно сделать это, но я не видел, чтобы это работало.

Я могу воспроизвести эту проблему с примером HelloWorld из руководства по Struts 2 для Eclipse, доступным здесь .

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 показывает index.jsp

Тоже хорошо.

Теперь, если я поменяю стояки 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» и т. д., чтобы исключить возможность кэширования браузера.

Я неправильно понял, что делает корневое пространство имен?А как отключить /foo/index.action от работы при разрешении /index.action?

Ответы [ 2 ]

2 голосов
/ 27 августа 2012

Вам необходимо определить как пакет по умолчанию, так и корневой пакет.Логика заключается в том, что если какое-либо действие не может быть найдено в вашем пакете с пространством имен "/ foo", struts2 будет искать то же имя действия в пакете по умолчанию.Если пакет по умолчанию не существует, он будет искать корневой пакет.Итак, вам нужно определить как пакет по умолчанию, так и корневой пакет.

<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>
0 голосов
/ 25 февраля 2014

Я сталкивался с тем же. Я проверил, определив как по умолчанию, так и корневое пространство имен. Это работает следующим образом: если действие не может быть найдено с указанным пространством имен, оно сначала ищет корневое пространство имен, а поиск пространства имен по умолчанию только после того, как это действие не завершается в корневом пространстве имен. Это отличается от документации Struts2, которую я прочитал. Это может быть версия Struts2? Я использовал распорки 2.3.16.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...