Страница не перенаправляет должным образом перехватчики2

Вот и все, я кодирую логин перехватчика, результат

<result name="login" type="redirectAction">access</result>

, все работает хорошо, но я думаю, что вспоминает это; результат перейти к доступу и снова запустить перехватчик и перейти к доступу и т. д. Я полагаю, потому что мой браузер показывает сообщение:

страница не перенаправляет должным образом.

Я использую Struts2 и плагин Rest.

Это мой перехватчик:

@Override
public String intercept(ActionInvocation invocation) throws Exception {

    HttpSession session = ServletActionContext.getRequest().getSession(false);
    Object loginObject = session.getAttribute("login");
    boolean login = false;

    if (loginObject != null) {
        login = (Boolean) loginObject;
        if (!login) {
            return Action.LOGIN;
        } else {
            return invocation.invoke();
        }
    } else {
        return Action.LOGIN;
    }

3 ответа

Решение

Когда вы возвращаете Action.LOGIN из Interceptor, результат выполняется, и так как результат имеет тип redirectActionдругой запрос создается и фильтруется через стек перехватчиков. Затем выполнение снова вызовет ваш перехватчик, что является нежелательным результатом.

Вам необходимо исключить выполнение вашего входа в перехватчик для access действие, используя стек по умолчанию, например.

<default-interceptor-ref name="myCustomLoginStack"/>

<action name="access" class="foo.bar.actions.Access">
    <result>access.jsp</result>
    <interceptor-ref name="defaultStack" />
</action>

<action name="foobar" class="foo.bar.actions.Foobar">
    <result>foo.jsp</result>
    <result name="login" type="redirectAction">access</result>
</action>

Расширяя замечание Романа о: установка значений сеанса в true и почему это лишнее

Вместо того, чтобы проверять значение значения сеанса, просто проверьте его наличие. При выходе из системы удалите объект сеанса либо явным образом (если вам нужны другие данные сеанса), либо аннулируйте сеанс.

Это дает дополнительное преимущество, сокращая ваш код примерно до следующего:

public String intercept(ActionInvocation invocation) throws Exception {
    Map    session     = invocation.getInvocationContext().getSession()
    Object loginObject = session.getAttribute("login");

    if (loginObject == null) {
      return LOGIN;
    }

    return invocation.invoke();
}

относительно getSession(false)обычно нет необходимости включать логический аргумент, поскольку страницы JSP будут создавать сеансы автоматически, если явно не объявлено об этом.

Ни login или же access устанавливает loginObject на сессию, и они не установили его true, что лишнее. В результате, если вы настроили этот перехватчик на действие, это предотвратит вызов и выполнение действия.

Другие вопросы по тегам