Я совершенно новичок в Struts2, перехватчиках и т. Д. ... Я пытаюсь создать страницу входа в систему и пытаюсь защитить ее с помощью одного пользовательского перехватчика.
Дело в том,что страница index.jsp правильно перенаправляется на Inicio.jsp, и форма правильно отображается на экране, но когда я нажимаю кнопку «отправить» (помеченную как «Логин»), она попадает на ту же страницу.
Отладка ситуации Я понимаю, что перехватчик принимает запрос, но метод getSession () из класса ActionInvocation не работает, поскольку ничего не дает.Я попытался получить шаг за шагом, и я вижу, что параметр actionInvocation имеет какое-то значение, и что этот метод возвращает некоторые вещи actionInvocation.getInvocationContext () ... но когда я попытался получить сеанс с такой строкой: Map session= actionInvocation.getInvocationContext (). getSession ();ничего не идет.
Я перепутал файл struts.xml и NetBeans, но мне удалось начать работать (или, по крайней мере, я так думаю, но я не уверен на 100%).
Я попробовал несколько «рабочих примеров», которые я нашел через Интернет, я пытался изменить перехватчик, userDAO, UserActionBean, UserAction, InterceptorLogin, сеанс ... много вещей, и некоторые из них выдавали ошибки (включая NPE), но ничего дляполучить любой дюйм света.
Это форма на странице Inicio.jsp:
<s:form action="validar" method="POST" namespace="/">
Это файл struts.xml:
<struts>
<constant name="struts.devMode" value="true" />
<package name="/" namespace="/" extends="struts-default" >
<interceptors>
<interceptor name="validar" class="InterceptorLogin" />
</interceptors>
<action name="validar" class="UserActionBean">
<interceptor-ref name="validar" />
<interceptor-ref name="defaultStack" />
<result name="INPUT">index.jsp</result>
<result name="SUCCESS">usuarios.jsp</result>
<result name="ADMIN">admin.jsp</result>
</action>
<action name="privado" class="Listado">
<result name="sucess">listado.jsp</result>
<result name="error">index.jsp</result>
</action>
</package>
</struts>
Этоэто InterceptorLogin.java file:
public class InterceptorLogin implements Interceptor {
@Override
public void destroy() {}
@Override
public void init () {}
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception{
System.out.println("Inside intercept method ...");
Map<String, Object> session = actionInvocation.getInvocationContext().getSession();
System.out.println("ActionInvocation "+actionInvocation);
System.out.println("getInvocationContext "+actionInvocation.getInvocationContext());
System.out.println("The sesion is "+session);
System.out.println("getName "+actionInvocation.getInvocationContext().getName());
System.out.println("getParameters "+actionInvocation.getInvocationContext().getParameters());
System.out.println("getContainer "+actionInvocation.getInvocationContext().getContainer());
System.out.println("User is "+session.get("user"));
if ("".equals(session.get("user")) || session.get("user")==null) {
System.out.println("Inside invocation's if");
return "INPUT";
} else {
String resultado=actionInvocation.invoke();
System.out.println("After intercept invocation ");
return resultado;
}
}
}
И, наконец, вот журнал из Apache, в котором можно прочитать следы, со смертельным предложением «Sesion is {}», которое подразумевает, что оно идет на юг черезпредложение if-else, и оно больше не работает.
12-May-2019 05:21:56.024 INFO [http-nio-8084-exec-239] org.apache.catalina.core.StandardContext.reload Se ha completado la recarga de este Contexto
Inside intercept method ...
ActionInvocation com.opensymphony.xwork2.DefaultActionInvocation@2de9277b
getInvocationContext com.opensymphony.xwork2.ActionContext@200ba829
The sesion is {}
getName validar
getParameters {user.password=[Ljava.lang.String;@3c3d7b1c, user.username=[Ljava.lang.String;@33801704}
getContainer com.opensymphony.xwork2.inject.ContainerImpl@57362cf0
User is null
Inside invocation's if
Как видите, все другие методы работают правильно, но я хочу использовать странные вещи.
Ожидаемый результат - получение сеанса от мethod getSession, чтобы иметь возможность продолжить с остальной логикой, чтобы проверить, существует ли сеанс или нет.
Заранее спасибо и с наилучшими пожеланиями,
Magius