方法actionInvocation.getInvocationContext()。getSession()不返回任何内容

时间:2019-05-12 03:42:15

标签: java spring netbeans struts2 interceptor

我对Struts2,拦截器等还很陌生...我现在正在尝试创建一个登录页面,并尝试使用我制作的一个自定义拦截器来保护它。

重点是页面index.jsp正确地重定向到Inicio.jsp,并且表单正确进入了屏幕,但是当我按下“提交”按钮(标记为“登录”)时,同一页。

调试情况我意识到拦截器正在接受请求,但是ActionInvocation类的getSession()方法无法正常工作,因为没有提供任何东西。 我尝试逐步进行操作,可以看到参数actionInvocation具有一些值,并且该方法返回了一些东西actionInvocation.getInvocationContext()...但是当我尝试使用这种方式获取会话时:Map session = actionInvocation.getInvocationContext()。getSession();     什么都没来。

我已经把struts.xml文件和NetBeans弄乱了,但是我设法上班了(或者至少我猜是这样,但是我不确定100%)。

我尝试了一些在互联网上找到的“工作示例”,尝试更改了拦截器,userDAO,UserActionBean,UserAction,InterceptorLogin,会话……很多事情,其中​​一些引发了错误(包括NPE),但没有以获得任何一英寸的光亮。

这是Inicio.jsp页面中的表单:

select id_service,
       max(case when type = 'AAA' then value end) as type_aaa,
       max(case when type = 'BBB' then value end) as type_bbb,
       max(case when type = 'CCC' then value end) as type_ccc
from t
group by id_service;

这是struts.xml文件:

   <s:form action="validar" method="POST" namespace="/"> 

这是InterceptorLogin.java文件:

   <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>

最后,这是来自Apache的日志,可以读取跟踪信息,其中带有凡人的句子“ sesion is {}”,这意味着它通过if-else句子向南移动,并且无法继续工作。

   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;
    }
}
}

如您所见,所有其他方法均正常工作,但我要使用的方法做的很奇怪。

预期结果是从getSession方法获取会话,以便能够继续执行其余逻辑来检查会话是否存在。

先谢谢您,

魔术师

1 个答案:

答案 0 :(得分:0)

是的,我有点愚蠢。方法getSession()不返回任何内容……因为它没有要返回的任何内容。

会话正在使用来自MySQL数据库的数据来实现...这是在调用中设置的。 if-else句子必须之后来从数据库中获取数据。

因此,正确的(或至少有效的)顺序是:

  1. 表单从用户那里获取用户名和密码。
  2. 拦截它并将其值发送到bean方法。
  3. 检查数据库是否存在。
  4. 根据是否存在以及用户类型返回不同的值。
  5. 拦截器评估此输出,然后将其发送回struts.xml文件,以确定接下来将显示哪个页面。

感谢那些检查/阅读了我的问题的人;-)

魔术师