sessionMap.invalidate() 在尝试注销时不起作用



我正在制作一个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";
}

当我尝试打印会话时,我正在获取对象,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
    
    
你不需要

使会话失效(会话通常是在你登陆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";
}

还要考虑

  • 通过会话感知接口获取会话,这是首选方式;
  • 使用应用于除登录操作之外的所有操作的自定义拦截器来检查用户是否经过身份验证。

我认为您在会话失效后尝试重用会话对象时遇到的会话失效问题。我在这里已经解释了。

如果要在使 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不应是web.xml中列出的welcome-file

login()操作中,您没有初始化sessionMap.

public String login(){
   Map session = ActionContext.getContext().getSession();
   SessionMap sessionMap=(SessionMap)session;
   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";
}
<小时 />

最新更新