Я в настоящее время нахожусь в процессе изучения 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();
}
}
Стандартный способ - вернуть специальный глобальный результат (например, "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: Вы, конечно, НЕ должны применять перехватчик к вашему действию входа в систему.