Перенаправление к другому действию в перехватчике в распорках 2

Я в настоящее время нахожусь в процессе изучения Struts 2, и я в настоящее время создаю простое приложение, где непроверенные пользователи перенаправляются к форме входа в систему.

У меня есть форма входа в систему и действие, функциональное, который берет пользовательские учетные данные, проверяет их и хранит Пользовательский объект на сессии однако, я теперь пытаюсь предотвратить доступ к страницам, прежде чем вход в систему произошел, и я пытаюсь сделать это с перехватчиком.

Моя проблема состоит в том, что я записал перехватчик, который проверяет, был ли Пользовательский объект сохранен на сессии, но если это не имеет, я хочу перенаправить к странице входа в систему и не могу найти способ сделать это, не обходя распорки и с помощью метода HttpServletResponse.sendRedirect

Конфигурация:

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

    <interceptors>
        <interceptor name="login" class="my.LoginInterceptor" />
    </interceptors>

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

    <action name="login" class="my.LoginAction">
        <result name="input">/admin/login.jsp</result>
        <result name="success" type="redirect">/admin</result>
    </action>

    <action name="private" class="my.PrivateAction">
        <result>/admin/private.jsp</result>
    </action>

</package>

Код перехватчика:

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

    Map<String, Object> session = inv.getInvocationContext().getSession();

    Object user = session.get("user");
    if(user == null) {

                      // redirect to the 'login' action here            

    }
    else {
        return inv.invoke();
    }

}
10
задан 3urdoch 8 June 2010 в 17:46
поделиться

1 ответ

Стандартный способ - вернуть специальный глобальный результат (например, "login") и определить глобальное отображение этого результата на ваш admin/login.jsp. Поэтому вы просто должны добавить эту строку:

if(user == null) {
      return "login";
}

И в вашем struts.xml:

<global-results>
   <result name="login">/admin/login.jsp</result>
</global-results>

BTW, я боюсь, что вы заменяете стандартный стек перехватчиков Struts2 вашим единственным перехватчиком, обычно вы хотите добавить ваш перехватчик в стек. Например:

<interceptors>
 <interceptor name="login" class="my.LoginInterceptor" />

 <interceptor-stack name="stack-with-login">
  <interceptor-ref name="login"/>
  <interceptor-ref name="defaultStack"/>
 </interceptor-stack>
</interceptors>
<default-interceptor-ref name="stack-with-login"/>

BTW2: Вы, конечно, НЕ должны применять перехватчик к вашему действию входа в систему.

18
ответ дан 3 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: