Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试注销时sessionMap.invalidate()不起作用_Java_Authentication_Struts2_Httprequest_Httpsession - Fatal编程技术网

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

Java 尝试注销时sessionMap.invalidate()不起作用,java,authentication,struts2,httprequest,httpsession,Java,Authentication,Struts2,Httprequest,Httpsession,我正在申请Struts2 我正在尝试注销,但我得到java.lang.NullPointerException 我的方法是: 公共字符串注销(){ 映射会话=ActionContext.getContext().getSession(); SessionMap SessionMap=(SessionMap)会话; log.info(“会话:+会话”); log.info(“sessionmap:+sessionmap”); log.info(“sessionMap.get()”+sessionM

我正在申请Struts2

我正在尝试注销,但我得到
java.lang.NullPointerException

我的方法是:

公共字符串注销(){
映射会话=ActionContext.getContext().getSession();
SessionMap SessionMap=(SessionMap)会话;
log.info(“会话:+会话”);
log.info(“sessionmap:+sessionmap”);
log.info(“sessionMap.get()”+sessionMap.get(“USROBJECT”);
试一试{
if(sessionMap!=null){
sessionMap.remove(“USROBJECT”);
sessionMap.invalidate();
}
}
捕获(例外e){
log.info(“异常为:+e.toString());
}
返回“注销”;
}
当我试图打印session、
sessionMap
“USROBJECT”
对象时,我得到了该对象,但当我调用
remove()
时,我得到了一个异常

登录方式:

publicmap session=ActionContext.getContext().getSession();
公共SessionMap SessionMap;
公共无效设置会话(映射会话){
sessionMap=(sessionMap)会话;
}
公共字符串登录(){
us=新用户会话();
us=getUserDetails();
log.info(“用户名是:+us.getUserName());
log.info(“密码为:+us.getPassword());
美国setLastLoginTime(loginTime);
sessionMap.put(“USROBJECT”,美国);
返回“登记簿”;
}
struts.xml


/jsp/register.jsp
/jsp/error.jsp
/jsp/login.jsp
17:09:31038信息登录操作:171-将删除USROBJECT
17:09:31038信息登录:183-异常为: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";
}
private final静态字符串USER\u KEY=“USROBJECT”;
公共字符串注销(){
映射会话=ActionContext.getContext().getSession();
if(session.containsKey(USER_KEY)){
会话。删除(用户密钥);
}
返回“注销”;
}
也考虑

  • ,这是首选方式
  • 使用自定义拦截器,应用于除登录操作之外的所有操作

    • 您不需要使会话无效(会话通常是在您登录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";
      }
      
      private final静态字符串USER\u KEY=“USROBJECT”;
      公共字符串注销(){
      映射会话=ActionContext.getContext().getSession();
      if(session.containsKey(USER_KEY)){
      会话。删除(用户密钥);
      }
      返回“注销”;
      }
      
      也考虑

      • ,这是首选方式
      • 使用自定义拦截器,应用于除登录操作之外的所有操作

      我认为会话失效的问题在于,您试图在会话失效后重用会话对象。我已经解释过了

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

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

      
      ....
      

      会话无效后,您应返回类型为
      重定向
      重定向操作
      的结果

      /jsp/login.jsp
      

      login.jsp
      不应是
      web.xml
      中列出的
      欢迎文件

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


      我认为会话失效的问题在于,在会话失效后,您试图重用会话对象。我已经解释过了

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

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

      
      ....
      

      会话无效后,您应返回类型为
      重定向
      重定向操作
      的结果

      /jsp/login.jsp
      

      login.jsp
      不应是
      web.xml
      中列出的
      欢迎文件

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


      我已经在sessionMap中添加了“USROBJECT”,但是当我试图删除它时,我得到了空指针exceptionRetry和上面的代码。不要使用SessionMap,使用常量来确保您没有在键名中生成拼写错误。另外,请尝试按照答案链接中描述的方式检索会话。请记住,你现在也可以投票了,因为你有15个声望点。我在sessionMap中添加了“USROBJECT”,但当我试图删除它时,我得到了空指针异常,使用上面的代码重试。不要使用SessionMap,使用常量来确保您没有在键名中生成拼写错误。另外,请尝试按照答案链接中描述的方式检索会话。注:记住你现在也可以投票了,因为你有15个声望点。嗨,即使在添加了你的代码之后,我也得到了同样的例外。我无法理解何时可以打印用户对象,那么当我试图删除它时为什么会出现空指针异常异常异常需要异常堆栈跟踪来诊断代码。另外,如果您将
      struts.xml
      添加到问题中也会很好。我正在添加我的登录方法、注销方法、struts.xml和jsp..请参阅。尝试重定向结果。我已将sessionMap初始化为public Map session=ActionContext.getContext().getSession(); 公共SessionMap SessionMap;