Метод actionInvocation.getInvocationContext (). GetSession () ничего не возвращает - PullRequest
0 голосов
/ 12 мая 2019

Я совершенно новичок в 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

1 Ответ

0 голосов
/ 12 мая 2019

Да, я немного глупый. Метод getSession () ничего не возвращает ... потому что ему ничего не нужно возвращать YET .

Сеанс выполняется с данными, поступающими из базы данных MySQL ... которые устанавливаются в invoke. Предложение if-else должно прийти ПОСЛЕ получения данных из БД.

Итак, правильный (или хотя бы рабочий) порядок:

  1. Форма принимает пользователя и пароль от пользователя.
  2. Перехватите его и отправьте значения в метод bean.
  3. Проверка по БД, если существует или нет.
  4. Возвращать различные значения в зависимости от того, существует ли и тип пользователя.
  5. Перехватите, оцените этот вывод и отправьте обратно в файл struts.xml, чтобы определить, какая страница будет показана далее.

Спасибо тем, кто проверил / прочитал мою проблему; -)

Magius

...