Struts2 - Как перенаправить на действие без использования struts.xml?

1

Мой веб-сервер предотвращает доступ к системе, если пользователь не вошел в систему, но некоторые пользователи могут иметь более одного профиля, и система разрешает только пользователям выбирать один из них, то есть пользователь может быть обычным пользователем с некоторыми разрешениями и этот же пользователь может выйти и снова войти в систему с правами администратора и получить доступ ко всему.

Когда возникает такая ситуация, я перенаправляю пользователя к действию, которое заставляет пользователя выбирать свой профиль, но сервер больше не знает действия, к которому пользователь пытался получить доступ. Я могу получить эту информацию через 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.

Теги:
redirect
struts2
java-ee-6
http-redirect

1 ответ

1

Вы можете использовать параметры в конфигурации 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>
  • 0
    В чем разница между <result type="redirectAction"> и <result type="redirectAction"> который предлагается по вашей ссылке в разделе комментариев к вопросу? И не должен ли результат иметь имя?
  • 0
    @PhilippeGioseffi: в основном они делают то же самое, но тот, что в ссылке, устанавливает некоторые параметры (например, id). Вам нужно использовать параметры actionName и namespace результата redirectAction чтобы достичь желаемого. И имя результата по умолчанию - success , поэтому, если вы возвращаете success из действия, вам не нужно помещать его в результат конфигурации.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню