struts2 добавление перехватчиков в struts.xml для всех классов действий
Я использовал среду Struts 2 и создал веб-приложение, в котором есть страница входа. У меня три разных Action
названные классы Action1
, Action2
, Action3
и различные представления для страниц JSP, которые отображаются при запуске некоторой бизнес-логики в Action
классы.
Теперь я хочу проверить, вошел ли пользователь в систему до Action
класс выполняет обработку. Итак, я создал перехватчик ниже, который отлично работает.
public String intercept(ActionInvocation invocation) throws Exception
{
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
if(session.isNew())
{
response.sendRedirect("Login.action");
}
System.out.println("Interceptor Fired");
String result = invocation.invoke();
return result;
}
В чем я хочу быть struts.xml
вместо добавления перехватчика для всех действий, как показано ниже
<interceptor-ref name="newStack"/>
мой struts.xml
файл имеет
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="printMsgInterceptor" class="LoginInterceptor"></interceptor>
<interceptor-stack name="newStack">
<interceptor-ref name="printMsgInterceptor"/>
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<action name="actone" class="Action1">
<result name="success">/success.jsp</result>
<interceptor-ref name="newStack"/>
</action>
<action name="acttwo" class="Action2">
<result name="success">/success.jsp</result>
<interceptor-ref name="newStack"/>
</action>
<action name="actthree" class="Action3">
<result name="success">/success.jsp</result>
<interceptor-ref name="newStack"/>
</action>
</package>
Для каждого действия я хочу, чтобы какое-то определение было написано в struts.xml
который запускает перехватчик, а не добавление вручную
<interceptor-ref name="newStack"/>
2 ответа
<interceptor name="test" class="Full path for LoginInterceptor" />
<interceptor-stack name="testStack">
<interceptor-ref name="test"/>
<interceptor-ref name="defaultStack"/> //here you are including default stack
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="testStack"></default-interceptor-ref>
Сейчас testStack
выполнит для каждого запроса
Использование
<default-interceptor-ref name="newStack"/>
Если ты не выкладываешь interceptor-ref
вручную для каждого действия вы можете использовать default-interceptor-ref
перехватывать все действия, которые явно не определены конфигурацией перехватчиков. Посмотрите, Как мы настраиваем Перехватчик, чтобы использоваться с каждым Действием.
Мы можем создать наши собственные именованные стеки и даже объявить новый стек перехватчиков по умолчанию для пакета
<package name="default" extends="struts-default" > <interceptors> <interceptor-stack name="myStack"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors>
Однако, если вы скажете, что перехватчик выше работает нормально, я призываю вас быть осторожным с бизнес-логикой, что действие входа не будет выполнено, если оно завершится неудачно при первом выполнении. Вместо проверки нового сеанса вы должны проверить результаты аутентифицированного пользователя и сохранить эти результаты в сеансе, который вы можете проверить в перехватчике. Смотрите этот вопрос для примера.
Пример написания перехватчика, использующего аутентифицированную информацию пользователя, в сеансе вы можете найти здесь.