2016-03-15 58 views
0

我在制作Struts2应用程序。sessionMap.invalidate()在尝试注销时不起作用

我想退出,但我正在逐渐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"; 
} 

我收到的时候我尝试打印会话,sessionMap和"USROBJECT"对象的对象,但是当我打电话给删除,我收到一个异常。请帮忙。

登录方法:

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 

回答

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

还要考虑

+0

我已经加入sessionMap的“USROBJECT”,但是当我试图将其删除,我得到空指针异常 – Raina

+0

重试与上面的代码。不要使用SessionMap,并使用常量来确保您不会在密钥名称中产生拼写错误。也可以尝试以链接的答案中描述的方式检索会话。 P.S:记住你现在也可以投票,因为你有15个声望点。 –

0

我认为在会话无效后,您尝试重新使用会话对象会导致会话失效。我已经解释过它here

如果您想在servlet会话失效后访问struts会话,则应更新或续订struts会话。

在JSP页面,您可以用s:if标签

<s:if test="#session.USROBJECT != null"> 
    .... 
</s:if> 

会话无效后,你应该返回redirect类型或redirectAction的结果,检查的对象。

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

login.jsp不应该在web.xml上市welcome-file

而在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"; 
    } 

+0

嗨,即使在添加代码后,我也会得到相同的异常。我无法理解何时能够打印用户对象,那么为什么当我试图删除它时,我得到空指针异常 – Raina

+0

需要异常堆栈跟踪来诊断代码。如果你在这个问题中增加'struts.xml',它也会很好。 –

+0

我正在添加我的登录方法,注销方法,struts.xml和jsp ..请参阅。 – Raina