Struts2判断session为空,session == null 和session.isEmpty()的区别?
我调试的时候,有时候发现 session的值是 {}
有时候是一些稀奇古怪的值,总之这值不是我自己存放进去的,也不知道这个session是怎么来的。org.apache.catalina.session.StandardSessionFacade@79d110例如上图两个
使用的是tomcat

解决方案 »

  1.   

    session == null 和session.isEmpty()
    null可以认为这个session对象不存在
    isEmpty可以认为对象存在,但是里面没有值
      

  2.   


    额,还问下,为什么用户关闭浏览器的时候,session没有退出呢?到第二天了也没退出  不知道是为啥。
    不是说session有个默认的生命周期嘛,谢谢。
      

  3.   

    session没退出什么意思。。你说的不会是cookie吧
      

  4.   

    关闭浏览器不会删除session。服务器也会保留session,除非你写程序删除session。
      

  5.   


    没用到cookie呢,我用了一个 SessionListener,直接关闭浏览器,到第二天登陆的时候,还是会提示用户已登陆,请重新登陆。public  class  SessionListener  implements  HttpSessionListener{
       @SuppressWarnings("unchecked")
    private  static  java.util.Hashtable  hUserName  =  new   Hashtable();
       public  void  sessionCreated(HttpSessionEvent  se){
             System.out.println( "客户端已连接服务器 --会话号为: " + se);
        }   public  void  sessionDestroyed(HttpSessionEvent  se){
               hUserName.remove(se.getSession());
               System.out.println( "用户会话已失效session -- " + se);
        }   @SuppressWarnings("unchecked")
    public  synchronized  static  boolean  isLogined(HttpSession  session,String  user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用
           boolean  flag  =   false;
           if(hUserName.containsKey(user_id1)){
                                 flag  =   true;
                                 HttpSession  vsession  =  (HttpSession)hUserName.get(user_id1);
                                 try   {
                                     vsession.invalidate();//踢掉先登陆者
                                     System.out.println("用户 - " + user_name + " || 已存在 - " +session);
                                     System.out.println("用户 - " + user_name + " || 被挤掉了");
                                 }
                                 catch  (Exception   ex){}
                         }
           else{
                   flag  =   false;
                   
           }
           hUserName.remove(user_id1);
           hUserName.remove(user_name);
           if(flag==false){//如果没有登陆则在哈西表中记录
           hUserName.put(user_id1,session);
           System.out.println("用户已经登陆: - " + user_name + " || 会话号为: - " +session);
           }
           return   flag;
        }   public  synchronized static boolean deleteUserName(HttpSession  session,String user_id1)
        {
       Date date=new Date();
       HttpSession  vsession  =  (HttpSession)hUserName.get(user_id1);
        System.out.println("用户已登出: - " + user_id1 + " || 会话号为: - " +session+date);
        hUserName.remove(user_id1); //删除用户Action调用
       // vsession.invalidate();//
        return true;
        }
       
       public  synchronized static void Isconnent(HttpSession  session,String user_id1,String user_name)
       {
    Date date=new Date();
       System.out.println("用户已登出: - " + user_name + " || session - " +session+"|| 当前时间为"+date);
       hUserName.remove(user_id1); //删除用户Action调用
       
       }
       
       
       public  synchronized  static  boolean  isOnline(HttpSession  session,String user_id1){//登陆后使用判断是否已经登陆Action调用
               boolean  flag  =   false;
              // System.out.println("======isOnline=======");
                HttpSession   vsession =null;
                try{
                   vsession  =  (HttpSession)  hUserName.get(user_id1);
                }catch(Exception e){
                 flag = true;
                 System.out.println(user_id1+"验证登陆异常");  flag = false;
                }
                   if(vsession != null){
                    if  (session.getId().equals(vsession.getId()))  {
                        flag  =   true;
                        System.out.println(user_id1+"通过验证");     
                    }  else   {
                        flag  =   false;
                    }
        }
                   return   flag;    }
    }
      

  6.   


    额,我有个SessionListener 监听器,里面有个sessionDestroyed()方法,
    貌似在session超时的时候会执行,也就不会出现这样的问题了。
    但是当用户直接关闭浏览器的时候,这个就不执行了,第二天登陆的时候,依然会提示用户已登陆,
    那个session就不会超时嘛?
      

  7.   

    哪是服务器里面的session起的作用。
      

  8.   

    你配下session生命周期呗
    <!-- session超时定义,单位为分钟 -->
    <session-config>
    <session-timeout>90</session-timeout>
    </session-config>web.xml里这样配置session时长
      

  9.   

    当用户直接关闭浏览器之后,这个设置貌似不起作用啊,怎么设置,在用户关闭浏览器的时候,调用SessionListener的 sessionDestroyed方法啊,谢谢。我发现,不设置这个的时候,他session也会过期,但是用户直接关闭浏览器的情况就不同了,用户的session信息是一直存放在这个Hashtable 里面的呢,如何解决呢,谢谢。public  class  SessionListener  implements  HttpSessionListener{
       @SuppressWarnings("unchecked")
    private  static  java.util.Hashtable  hUserName  =  new   Hashtable();
       public  void  sessionCreated(HttpSessionEvent  se){
             System.out.println( "客户端已连接服务器 --会话号为: " + se);
        }   public  void  sessionDestroyed(HttpSessionEvent  se){
               hUserName.remove(se.getSession());
               System.out.println( "用户会话已失效session -- " + se);
        }   @SuppressWarnings("unchecked")
    public  synchronized  static  boolean  isLogined(HttpSession  session,String  user_id1,String user_name){//(踢掉先登陆者再抢)是否该帐户已经在使用Action调用
           boolean  flag  =   false;
           if(hUserName.containsKey(user_id1)){
                                 flag  =   true;
                                 HttpSession  vsession  =  (HttpSession)hUserName.get(user_id1);
                                 try   {
                                     vsession.invalidate();//踢掉先登陆者
                                     System.out.println("用户 - " + user_name + " || 已存在 - " +session);
                                     System.out.println("用户 - " + user_name + " || 被挤掉了");
                                 }
                                 catch  (Exception   ex){}
                         }
           else{
                   flag  =   false;
                   
           }
           hUserName.remove(user_id1);
           hUserName.remove(user_name);
           if(flag==false){//如果没有登陆则在哈西表中记录
           hUserName.put(user_id1,session);
           System.out.println("用户已经登陆: - " + user_name + " || 会话号为: - " +session);
           }
           return   flag;
        }   public  synchronized static boolean deleteUserName(HttpSession  session,String user_id1)
        {
       Date date=new Date();
       HttpSession  vsession  =  (HttpSession)hUserName.get(user_id1);
        System.out.println("用户已登出: - " + user_id1 + " || 会话号为: - " +session+date);
        hUserName.remove(user_id1); //删除用户Action调用
       // vsession.invalidate();//
        return true;
        }
       
       public  synchronized static void Isconnent(HttpSession  session,String user_id1,String user_name)
       {
    Date date=new Date();
       System.out.println("用户已登出: - " + user_name + " || session - " +session+"|| 当前时间为"+date);
       hUserName.remove(user_id1); //删除用户Action调用
       
       }
       
       
       public  synchronized  static  boolean  isOnline(HttpSession  session,String user_id1){//登陆后使用判断是否已经登陆Action调用
               boolean  flag  =   false;
              // System.out.println("======isOnline=======");
                HttpSession   vsession =null;
                try{
                   vsession  =  (HttpSession)  hUserName.get(user_id1);
                }catch(Exception e){
                 flag = true;
                 System.out.println(user_id1+"验证登陆异常");  flag = false;
                }
                   if(vsession != null){
                    if  (session.getId().equals(vsession.getId()))  {
                        flag  =   true;
                        System.out.println(user_id1+"通过验证");     
                    }  else   {
                        flag  =   false;
                    }
        }
                   return   flag;    }
    }
      

  10.   


    我奇怪的是,用户直接关闭了浏览器,他session到期了也没执行sessionDestroyed方法啊。