尝试注销时sessionMap.invalidate()无法正常工作

时间:2016-03-15 10:59:11

标签: java login struts2 httprequest httpsession

我正在制作一个Struts2应用程序。

我正在尝试退出,但我收到了java.lang.nullpointerexception

我的方法是:

  public String logout(){

    Map session = ActionContext.getContext().getSession();
    SessionMap sessionMap=(SessionMap)session;
    log.info("session:"+session);
    log.info("sessionmap:"+sessionMap);
    log.info("sessionMap.get()"+sessionMap.get("USROBJECT"));
    try{
    if(sessionMap!=null){

        sessionMap.remove("USROBJECT");
        sessionMap.invalidate();

    }
    }
    catch(Exception e){
        log.info("Exception is:"+e.toString());
    }


    return "LOGOUT";
}

当我尝试打印session,sessionMap和"USROBJECT"对象时,我得到了对象,但是当我调用remove时,我得到了一个异常。请帮忙。

登录方式:

  public Map session = ActionContext.getContext().getSession();
  public SessionMap sessionMap;   
  public void setSession(Map session) {
    sessionMap=(SessionMap) session;
    }

  public String login(){
       us = new UserSession();
       us= getUserDetails();
       log.info("userName is:"+us.getUserName());
       log.info("password is:"+us.getPassword());
       us.setLastLoginTime(loginTime);

       sessionMap.put("USROBJECT", us);
       return "register";
    }

struts.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
 <constant name="struts.devMode" value="true" /> 
 <constant name="struts.enable.DynamicMethodInvocation" value="false" />
 <package name="Hello" extends="struts-default">

   <action name="*LoginAction" method="{1}"
        class="com.pgnext.apps.action.LoginAction">




    <result name="register">/jsp/register.jsp</result> 
    <result name="error">/jsp/error.jsp</result>
    <result name="logout">/jsp/login.jsp</result> 
  </action>

  </package>
</struts>
  17:09:31,038  INFO LoginAction:171 - going to remove USROBJECT
  17:09:31,038  INFO LoginAction:183 - Exception is : java.lang.NullPointerException

2 个答案:

答案 0 :(得分:0)

您不需要使会话无效(通常在您登陆JSP时创建会话),只需从中删除您的对象:

private final static String USER_KEY = "USROBJECT";

public String logout(){
    Map<String,Object> session = ActionContext.getContext().getSession();
    if (session.containsKey(USER_KEY)) { 
        session.remove(USER_KEY);
    }
    return "LOGOUT";
}

还要考虑

答案 1 :(得分:0)

我认为在会话失效后,您尝试重用会话对象的会话失效问题。我已解释过它here

  

如果要在使servlet会话无效后访问struts会话,则应更新或更新struts会话。

在JSP页面上,您可以使用s:if标记

检查对象
<s:if test="#session.USROBJECT != null">
  ....
</s:if>

会话失效后,您应该返回redirectredirectAction类型的结果。

<result type="redirect" name="logout">/jsp/login.jsp</result> 

login.jsp不应该是welcome-file中列出的web.xml

login()行动中,您未初始化sessionMap

   public String login(){
       Map session = ActionContext.getContext().getSession();
       SessionMap sessionMap=(SessionMap)session;
       us = new UserSession();  //don't need it
       UserSession us = getUserDetails();
       if (us != null) {
         log.info("userName is:"+us.getUserName());
         log.info("password is:"+us.getPassword());
         us.setLastLoginTime(loginTime);

         sessionMap.put("USROBJECT", us);
       }
       return "register";
    }