不用检查,一个浏览器只能有一个sessionId来记录用户登录。想判断也很简单,在jsp中用java脚本,这么写:session.getAttribute(key),看看这个结果是不是空,不是空,就说明已登录

解决方案 »

  1.   

    限制一个浏览器就用session,限制一台机器就用IP+MAC地址
      

  2.   

      key值用什么?session的id么?我试了下,同一个浏览器两个选项卡登陆,session的id不同啊,判断不了。
      

  3.   

    在数据库中增加一个用户状态,如果用户登录了,那么就将此状态设为1,如果退出登录,就将此状态设为0。
    用户登录时,先检查此状态是否为0。如果不是0,就不允许登录。
    为防止用户不正常退出(直接关闭浏览器等操作),可以设定session超时时间,并监听session失效事件。当session失效时,将状态设为0。
      

  4.   

      请问怎么解决?感觉一楼的思路是可行的,但是不知道怎么去判断,key值是什么
      

  5.   

      key值用什么?session的id么?我试了下,同一个浏览器两个选项卡登陆,session的id不同啊,判断不了。没办法做到同一个浏览器同时有两个用户登录,除非你用了两个session才可以不过没这么干的,再说,同一个浏览器同时有两个用户登录需求中也没有这么干的
      

  6.   


    session保存数据的方法是以键值对的形式存储的,session.put("key","value"),key值就是这个啊!
      

  7.   

    session  可以 解决这个  问题、、、登陆前 判断一下应该就可以了
      

  8.   


    session保存数据的方法是以键值对的形式存储的,session.put("key","value"),key值就是这个啊!
    我知道是键值对的,但是怎么判断呢?我就是不晓得怎么判断。比如我写了个下面的测试代码,结果同一个浏览器中两个选项卡,登陆了两个用户,str都是null,所以判断不了啊 String str=(String) request.getSession().getAttribute("test");
             if(str==null||str.equals(""))   //同一个浏览器中第一个用户登陆
             {
              request.getSession().setAttribute("test", "aaaaaaaaaaa");
             
             }
             else  //同一个浏览器中第二个用户登陆
             {
             
             }
      

  9.   

    你登录的时候,是不是把用户对象存入到session中,程序中是这么写的:
    User user = userDao.getUser(name, pwd); //userDao是访问数据库,根据name和pwd从数据库中查出这个User
    session.setAttribute("user", user); //就是一个键值对存在这个session会话中,来表示user用户已经登录,这里就完成登录了即然你想查看是不是有用户登录,就这么写:
    User user = session.getAttribute("user");//这里从session取出这个当前登录用户
    if(user == null){
    没登录
    }esle {
    有用户登录
    }其实,你说的这个需求在项目开发中很常见,比如权限,用户登录了才能用行一系列的操作
      

  10.   

    你写的这个方法,跟我上面提供的代码其实是一样的效果。可能我没有说清楚,我说的是同一个浏览器不同选项卡登陆不同用户。比如用户A已经登陆,我新开一个选项卡,用户B账号再登陆。如果已经有A登陆成功了,我要防止B用户在这个浏览器中登陆。就是一个浏览器只能登陆一个用户(其他不同的用户名用户登陆时要检测到)。用你的方法,只能判断同一个用户的多次登录吧
      

  11.   

    你写的这个方法,跟我上面提供的代码其实是一样的效果。可能我没有说清楚,我说的是同一个浏览器不同选项卡登陆不同用户。比如用户A已经登陆,我新开一个选项卡,用户B账号再登陆。如果已经有A登陆成功了,我要防止B用户在这个浏览器中登陆。就是一个浏览器只能登陆一个用户(其他不同的用户名用户登陆时要检测到)。用你的方法,只能判断同一个用户的多次登录吧 这个应该无法实现吧,再说了,这么做也没什么意义啊,为了用户登录信息安全,这个功能是不会出现在实际开以项目中再说了,登录就一定会用session会话啊,一个session会话表示的是一个浏览器,不是多个
      

  12.   

    你写的这个方法,跟我上面提供的代码其实是一样的效果。可能我没有说清楚,我说的是同一个浏览器不同选项卡登陆不同用户。比如用户A已经登陆,我新开一个选项卡,用户B账号再登陆。如果已经有A登陆成功了,我要防止B用户在这个浏览器中登陆。就是一个浏览器只能登陆一个用户(其他不同的用户名用户登陆时要检测到)。用你的方法,只能判断同一个用户的多次登录吧 这个应该无法实现吧,再说了,这么做也没什么意义啊,为了用户登录信息安全,这个功能是不会出现在实际开以项目中再说了,登录就一定会用session会话啊,一个session会话表示的是一个浏览器,不是多个
    现在就是有意义,功能很简单,就是让一个浏览器只能登陆一个用户。若浏览器已经登陆了一个用户,再登陆其他用户就提示该浏览器已经登陆了另外一个用户,请注销后再登陆。   肯定可以实现的,我看到别人的网站都可以实现此功能。
      

  13.   

    你写的这个方法,跟我上面提供的代码其实是一样的效果。可能我没有说清楚,我说的是同一个浏览器不同选项卡登陆不同用户。比如用户A已经登陆,我新开一个选项卡,用户B账号再登陆。如果已经有A登陆成功了,我要防止B用户在这个浏览器中登陆。就是一个浏览器只能登陆一个用户(其他不同的用户名用户登陆时要检测到)。用你的方法,只能判断同一个用户的多次登录吧 这个应该无法实现吧,再说了,这么做也没什么意义啊,为了用户登录信息安全,这个功能是不会出现在实际开以项目中再说了,登录就一定会用session会话啊,一个session会话表示的是一个浏览器,不是多个
    现在就是有意义,功能很简单,就是让一个浏览器只能登陆一个用户。若浏览器已经登陆了一个用户,再登陆其他用户就提示该浏览器已经登陆了另外一个用户,请注销后再登陆。   肯定可以实现的,我看到别人的网站都可以实现此功能。对啊,就按上面我说的,如果有user不为空,就直接return,不进行登录了,当然可以返回一些提示比如:其它用户已经登录。user为空,就session.setAttribute(),来登录,这不就成了么?
      

  14.   

    你写的这个方法,跟我上面提供的代码其实是一样的效果。可能我没有说清楚,我说的是同一个浏览器不同选项卡登陆不同用户。比如用户A已经登陆,我新开一个选项卡,用户B账号再登陆。如果已经有A登陆成功了,我要防止B用户在这个浏览器中登陆。就是一个浏览器只能登陆一个用户(其他不同的用户名用户登陆时要检测到)。用你的方法,只能判断同一个用户的多次登录吧 这个应该无法实现吧,再说了,这么做也没什么意义啊,为了用户登录信息安全,这个功能是不会出现在实际开以项目中再说了,登录就一定会用session会话啊,一个session会话表示的是一个浏览器,不是多个
    现在就是有意义,功能很简单,就是让一个浏览器只能登陆一个用户。若浏览器已经登陆了一个用户,再登陆其他用户就提示该浏览器已经登陆了另外一个用户,请注销后再登陆。   肯定可以实现的,我看到别人的网站都可以实现此功能。对啊,就按上面我说的,如果有user不为空,就直接return,不进行登录了,当然可以返回一些提示比如:其它用户已经登录。user为空,就session.setAttribute(),来登录,这不就成了么?即使已经有用户登录了,新开选项卡登陆第二个用户,user依然是null,判断不了
      

  15.   

    你写的这个方法,跟我上面提供的代码其实是一样的效果。可能我没有说清楚,我说的是同一个浏览器不同选项卡登陆不同用户。比如用户A已经登陆,我新开一个选项卡,用户B账号再登陆。如果已经有A登陆成功了,我要防止B用户在这个浏览器中登陆。就是一个浏览器只能登陆一个用户(其他不同的用户名用户登陆时要检测到)。用你的方法,只能判断同一个用户的多次登录吧 这个应该无法实现吧,再说了,这么做也没什么意义啊,为了用户登录信息安全,这个功能是不会出现在实际开以项目中再说了,登录就一定会用session会话啊,一个session会话表示的是一个浏览器,不是多个
    现在就是有意义,功能很简单,就是让一个浏览器只能登陆一个用户。若浏览器已经登陆了一个用户,再登陆其他用户就提示该浏览器已经登陆了另外一个用户,请注销后再登陆。   肯定可以实现的,我看到别人的网站都可以实现此功能。对啊,就按上面我说的,如果有user不为空,就直接return,不进行登录了,当然可以返回一些提示比如:其它用户已经登录。user为空,就session.setAttribute(),来登录,这不就成了么?即使已经有用户登录了,新开选项卡登陆第二个用户,user依然是null,判断不了怎么可能,只要是在操作系统中的浏览器的开着,学永远不会出现这种情况你用的什么浏览器啊
      

  16.   

    你写的这个方法,跟我上面提供的代码其实是一样的效果。可能我没有说清楚,我说的是同一个浏览器不同选项卡登陆不同用户。比如用户A已经登陆,我新开一个选项卡,用户B账号再登陆。如果已经有A登陆成功了,我要防止B用户在这个浏览器中登陆。就是一个浏览器只能登陆一个用户(其他不同的用户名用户登陆时要检测到)。用你的方法,只能判断同一个用户的多次登录吧 这个应该无法实现吧,再说了,这么做也没什么意义啊,为了用户登录信息安全,这个功能是不会出现在实际开以项目中再说了,登录就一定会用session会话啊,一个session会话表示的是一个浏览器,不是多个
    现在就是有意义,功能很简单,就是让一个浏览器只能登陆一个用户。若浏览器已经登陆了一个用户,再登陆其他用户就提示该浏览器已经登陆了另外一个用户,请注销后再登陆。   肯定可以实现的,我看到别人的网站都可以实现此功能。对啊,就按上面我说的,如果有user不为空,就直接return,不进行登录了,当然可以返回一些提示比如:其它用户已经登录。user为空,就session.setAttribute(),来登录,这不就成了么?即使已经有用户登录了,新开选项卡登陆第二个用户,user依然是null,判断不了怎么可能,只要是在操作系统中的浏览器的开着,学永远不会出现这种情况你用的什么浏览器啊你这里的session是指什么session?是controller中的request.getSession()吗?我用这样的方式获取session确实没法实现你说的那种效果
      

  17.   

    用的IE8。在controller中的request.getSession()获取session
      

  18.   

    打开浏览器,在选项卡A中输入登录页面(*/login.html)登录用户a,然后再打开一个选项卡B输入登录页面(*/login.html)尝试登录用户b,提交后你想提示:已经有用户登录等信息。是这个意思么?如果是这样的,可以有两种方法解决:
    方案一
    登录时判断session中是否已经有用户信息并且与当前用户名一致。即
    User user = userDao.getUser(username, password);
    //userDao是访问数据库,根据name和pwd从数据库中查出这个User
    session.setAttribute("user", user);
    //保存登录用户信息
    if(session.getAttribute("user")!=null)
    {
      System.out.println("已经有用户登录。");
      return;
    }
    User user = userDao.getUser(username, password);
    //userDao是访问数据库,根据name和pwd从数据库中查出这个User
    session.setAttribute("user", user);
    //保存登录用户信息
    方案二
    更趋于人性化的设计时如果已经有用户登录则不应该再显示登录框。
    即当请求登录表单页面时,判断是否有用户登录(即session.getAttribute("user")!=null)。
      

  19.   

    只能session了,但session有性能影响。看你用户并发量如何了,再作设计!
      

  20.   

    对,就是你这个意思,完全相同的理解。可是我用这样的方式,在开第二个选项卡判断登陆的时候,user依然是空?这是问题的关键。我是在controller中的request.getSession()获取session对象做你贴的代码那样处理。请问是不是session取法不对?还是其他什么原因
      

  21.   

    对,就是你这个意思,完全相同的理解。可是我用这样的方式,在开第二个选项卡判断登陆的时候,user依然是空?这是问题的关键。我是在controller中的request.getSession()获取session对象做你贴的代码那样处理。请问是不是session取法不对?还是其他什么原因两个session不是一个。
    我们项目有一种做法,用静态类保留一个sesion队列,登录的时候去查询session是否有当前登录的用户的session然后做操作。
      

  22.   


    从session中取user并判断是否为null的操作应该最前面的。登录成功时要保存user到session的。这样你在同一个浏览器中第一次登录时正常访问,再用另一选项卡登录时就可以检测出来并可以禁止二次登录了。
      

  23.   


    从session中取user并判断是否为null的操作应该最前面的。登录成功时要保存user到session的。这样你在同一个浏览器中第一次登录时正常访问,再用另一选项卡登录时就可以检测出来并可以禁止二次登录了。  
    关键是session不同,第二次登陆的时候,取出来的user是null,即使第一次登陆的时候存了user信息。
      

  24.   

    对,就是你这个意思,完全相同的理解。可是我用这样的方式,在开第二个选项卡判断登陆的时候,user依然是空?这是问题的关键。我是在controller中的request.getSession()获取session对象做你贴的代码那样处理。请问是不是session取法不对?还是其他什么原因两个session不是一个。
    我们项目有一种做法,用静态类保留一个sesion队列,登录的时候去查询session是否有当前登录的用户的session然后做操作。这种方法只能处理同一个用户登陆吧?如果两个选项卡登陆的是不同的用户怎么处理呢?也区分不了
      

  25.   

     ThreadLocal 就能解决了,不需要依赖session
      

  26.   


    你理解错了吧?两个选项卡使用的是同一个session,所以如果已经有用户登录,那么再次登录的时候后台还是从同一个session中取数据进行校验的。所以应该可以满足你的要求。除非,你开启了浏览器的特殊设置——比如,360浏览器经过设置可以同时登录多个游戏账号。
      

  27.   


    你理解错了吧?两个选项卡使用的是同一个session,所以如果已经有用户登录,那么再次登录的时候后台还是从同一个session中取数据进行校验的。所以应该可以满足你的要求。除非,你开启了浏览器的特殊设置——比如,360浏览器经过设置可以同时登录多个游戏账号。
    解决了哈,就是用session判断。之前是由于做了特殊设置导致的。谢谢大家