我对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方法获取会话,以便能够继续执行其余逻辑来检查会话是否存在。
先谢谢您,
魔术师
答案 0 :(得分:0)
是的,我有点愚蠢。方法getSession()不返回任何内容……因为它没有还要返回的任何内容。
会话正在使用来自MySQL数据库的数据来实现...这是在调用中设置的。 if-else句子必须之后来从数据库中获取数据。
因此,正确的(或至少有效的)顺序是:
感谢那些检查/阅读了我的问题的人;-)
魔术师