Мой веб-сервер предотвращает доступ к системе, если пользователь не вошел в систему, но некоторые пользователи могут иметь более одного профиля, и система разрешает только пользователям выбирать один из них, то есть пользователь может быть обычным пользователем с некоторыми разрешениями и этот же пользователь может выйти и снова войти в систему с правами администратора и получить доступ ко всему.
Когда возникает такая ситуация, я перенаправляю пользователя к действию, которое заставляет пользователя выбирать свой профиль, но сервер больше не знает действия, к которому пользователь пытался получить доступ. Я могу получить эту информацию через ActionInvocation, как показано ниже:
public String initFeature() {
final ActionInvocation invocation = ServletActionContext.getActionContext(BaseAction.getRequest())
.getActionInvocation();
final Object action = invocation.getAction();
if (!this.isUserFullyLogged() && !(action instanceof ProfileSelectionAction)) {
final Boolean isPendingProfileSelection = (Boolean) this
.retrieveSessionAttribute(Constants.PENDING_PROFILE_SELECTION);
if (isPendingProfileSelection != null && isPendingProfileSelection.booleanValue()) {
this.saveSessionAttribute("action", action);
this.saveSessionAttribute("namespace", invocation.getProxy().getNamespace());
return Constants.PROFILE_SELECTION;
}
return Action.LOGIN;
}
return Action.SUCCESS;
}
Когда система достигает действия выбора профиля, у меня есть действие и пространство имен, к которому пользователь пытался получить доступ, и он запретил, но я не знаю, что мне нужно сделать, чтобы перенаправить систему на это пространство имен и действие, потому что я только сделал он использует результат действия файла struts.xml.
Вы можете использовать параметры в конфигурации result
в файле struts.xml
. Создайте два свойства внутри вашего класса действий, которые будут содержать имя действия и пространства имен и использовать их в struts.xml
следующим образом:
<action name="..." class="...">
<result type="redirectAction">
<param name="actionName">${action}</param>
<param name="namespace">${namespace}</param>
</result>
</action>
Кроме того, если вы не хотите их создавать, и вы уже сохраняете свои переменные в сеансе, вы также можете извлекать их из сеанса, используя выражение #session
.
<action name="..." class="...">
<result type="redirectAction">
<param name="actionName">${#session.action}</param>
<param name="namespace">${#session.namespace}</param>
</result>
</action>
<result type="redirectAction">
и<result type="redirectAction">
который предлагается по вашей ссылке в разделе комментариев к вопросу? И не должен ли результат иметь имя?actionName
иnamespace
результатаredirectAction
чтобы достичь желаемого. И имя результата по умолчанию -success
, поэтому, если вы возвращаетеsuccess
из действия, вам не нужно помещать его в результат конфигурации.