2016-03-15 38 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