假设 有2个人用同一个帐号 ,不能同时登录 只能有一个人登录 ,求解决方法?

解决方案 »

  1.   

    用拦截器 判断session中 是否有登录信息
    有的话 T掉前一个用户 
    要做到很友好的 还是不容易的  看你的需求了
      

  2.   

    所谓的单点登录。????
    一直没做过。
    http://www.hao023.com/uploads/dandiandenglu.pdf
      

  3.   

    楼主用acegi 吧 用spring security也行。
    直接用 sessioncotroller 限制用户登录个数为1,
    并且设置其为 替换登录为true,就可以实现。
    楼主给分.
      

  4.   

    同意3楼,服务器端用session记录登录账号,有用户登录则进行判断。
      

  5.   

    在数据库里给用户设置个登录状态,登录时为true。未登录为false,登陆之前做个判断就好了
      

  6.   

    session的超时是很麻烦的,如果是默认的30分钟,那么你第一次登录了,忘记退出登录,那么你会很恶心。所以session的超时时间必须设置的很短,但这么做也会造成用户使用的不方便。所以,短的session必须配套一个定时的刷新程序(touch),保证session的有效性。至于限制,基于用户名和session的Map是可以考虑的。
      

  7.   

    将登陆的用户放到application里,做一个监听,我写的一个servlet,给你参考下:
    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

    String username = request.getParameter("username");

    String password = request.getParameter("password");

    HttpSession session = request.getSession();

    ServletContext application = session.getServletContext();

    String msg = "";

    boolean isLogin = false;

    Connection conn = ConnectionManager.getConnection();

    String sql = "select * from t_loginuser where username = ? and password = ?";

    PreparedStatement stmt;

    try {

    stmt = conn.prepareStatement(sql);

    stmt.setString(1,username);

    stmt.setString(2,password);

    ResultSet rs = stmt.executeQuery();

    if(rs.next()){

    User user = new User();

    user.setUsername(rs.getString("USERNAME"));

    Map users = (Map)application.getAttribute("LOGINUSERMAP");

    if(users == null){

    users = new HashMap<String, User>();

    application.setAttribute("LOGINUSERMAP", users);

    users.put(user.getUsername(), user);

    session.setAttribute("LOGINUSER", user);

    users.put(user.getUsername(), user);

    msg = "欢迎您,"+user.getUsername();

    request.setAttribute("msg", msg);

    request.getRequestDispatcher("/welcome.jsp").forward(request, response);

    }else{

    Set<String> usernames = users.keySet();

    for (String un : usernames) {

    if (un.equals(user.getUsername())) {

    msg = "用户已经登录";

    isLogin = true;

    break;

    }

    }

    if (isLogin) {

    request.setAttribute("msg", msg);

    request.getRequestDispatcher("/index.jsp").forward(request, response);

    }else {

    session.setAttribute("LOGINUSER", user);

    users.put(user.getUsername(), user);

    msg = "欢迎您,"+user.getUsername();

    request.setAttribute("msg", msg);

    request.getRequestDispatcher("/welcome.jsp").forward(request, response);

    }

    }

    }else {
    msg = "用户名或密码错误";

    request.setAttribute("msg", msg);

    request.getRequestDispatcher("/index.jsp").forward(request, response);

    }

    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
      

  8.   

    单独用个表来记录登录人的信息,如LoginSessionInfo当用户登陆时,这个表中就记录该用户的相关信息,如登录时间,登录哪个系统每个agent来登录的时候,都会去查看这个table中是否存在对应记录,如果存在,那么提示:NOT RELOGIN退出的时候将该表中对应信息删除
      

  9.   

    你这个根本不成的,呵呵,我原来学JSP时,也看书上这么写过,当时以为能实现,现在再看都是浮云~~~~
      

  10.   

    最简单的就是数据库里字段判断+session监听状态,如果就单单session判断效果不好登陆时使用session监听去数据库中查看状态,如果状态是登陆,则监听去返回 
    在web.xml文件中配置一个HttpSessionListener监听器和一个过滤器,登陆时使用一个过滤器首先来根据请求登陆信息参数查找数据库记录,并查看相应记录的登陆字段状态:
    1、如果登陆字段状态为已登陆,则该过滤器返回用户已经登陆的提示相应信息。
    2、如果登陆字段状态为未登陆,则该过滤器继续处理请求,使请求request对象生成一个新的session保存用户信息后同时由HttpSessionListener监听器的sessionCreated(HttpSessionEvent event)方法更改数据库中登陆字段的标记状态为“登陆”,返回请求,使该过滤器转由其他组件处理。
    3、当该session超时时,由HttpSessionListener监听器的sessionDestroyed(HttpSessionEvent event)方法再将该登陆字段状态改回未登陆的标记值“未登陆”。
      

  11.   

    这个样应该 在用户关掉浏览器后,在一段时间内(也就是等到那个session超期后)同样的账号还是能登陆的,如果想立即登陆,除非使用“挤掉”的方法,那样就要复杂些了利用发放许可或绑定ip的一些手段了
      

  12.   

    在帐号登录前,检测session中是否已保存该帐号。若无,则允许登录,并存入session;若有,则不让登录。
      

  13.   

    可以写个使用监听器,继承HttpSessionListener,当session到期或者用户退出时就会触发该Listener,执行相关你定制的操作。
      

  14.   

    同意用map,session的刷新用心跳模式,WEBQQ就是用心跳模式。
      

  15.   

     这个还行  ,数据库记录登陆状态,其他的例如session只能解决同一地点是存在的问题,同一账号异地登陆的session就没法管理了 
      

  16.   

    服务器要有一个哈希表 保存当前的全部会话 每次有新用户登录的时候 使用userId到此哈希表中进行检测...麻烦的是 用户主动退出 或者session过期的时 要记得清理此哈希表中对应的记录 需要使用session监听器
      

  17.   

    Web 系统不能限制“假设 有2个人用同一个帐号 ,不能同时登录 只能有一个人登录”!!
    原因如下:如果做了限制,则会发生问题。如果第一个人登录后,一不小心关闭浏览器,然后他/她自认倒霉,重新登录,服务器记录已经有人登录了(浏览器session id 不同),那他/她只能傻等服务器端"session timeout",不是很耽误事情么?
    如果加上 IP 地址判断,那也不行。通过代理服务器上网的两个用户,你服务器端只能获取到代理服务器ip,无法判断。从业务逻辑上也不需要做限制:
    1. 如果两个人都有用户名和密码,说明他们都可能是合法用户。
    2. 如果两个人中有一个人是坏人,那么你无法知道哪个人是坏人。有可能第一个是坏人,正常登录,你系统放进去;第二个人是好人,正常登录,你把他拦住,他想工作都做不了,也耽误事情。
      

  18.   

    在数据库中创建一张在线用户表,字段如下
    在线用户名 登陆IP 登陆时间 下线时间 用户ID sessionID
    用户每次登陆就往用户表中增加一条记录 下线时间不增加
    判断一个用户是否在线
    select count(*) from OnlineUser where 下线时间  is null and 用户ID=?
    如果在线就把他T掉
    update OnlineUser set 下线时间 =getdate() where 下线时间  is null and userId=?
    再让后一个用户登陆,然后通知前一个用户他下线,并且把地址指向登陆界面。
    如果不会 单独联系 QQ275080310 我有权限控制的单独项目。
      

  19.   

    我还是比较赞同使用session监听器加数据表字段的方案
      

  20.   

    最好的方法就是session记录,然后在判断!
      

  21.   

    可以试试这样的模式: 
    A,B 两人,
    A 登录中,B 要登录,提示 此用户已登录,是否强制登录?
    强制登录:A清除,B登录,A再次提交请求后,提示请重新登录.
    不强制登录:一切照常
      

  22.   


    补充下,数据库中也需要一个字段来描述是否登录中.
    这样可以避免,"如果第一个人登录后,一不小心关闭浏览器,然后他/她自认倒霉,重新登录,服务器记录已经有人登录了(浏览器session id 不同),那他/她只能傻等服务器端"session timeout",不是很耽误事情么?
    "
    现在在给中国银行做个东西,也用的这个模式.
      

  23.   

    弄一个全局全量,比如一个类中的静态变量,类型是List,每个用户登录成功的时候你就把这个用户放进去,并把这个用户放到session 中去,然后你再写一个会话监听器,当监听到会话即将结束的时候你就从会话中取到这个用户名,然后去list把这个用户名去掉。当然这样做的坏处是,一个账号只能和一个会话进行绑定,当用户关掉浏览器的时候,服务器端的会话可能并没有结束,这时候你再打开浏览器去登录,你就不能登录进去了
      

  24.   

    你所说“也用的这个模式”,是指“后者踢前者”,还是“后者傻等啊”?
    “后者踢前者”不礼貌。再说别人如果写了半个小时文章,你突然把他踢掉,他不骂娘才怪。
    “是否登录中”在 web 系统中无法实现,用户“一不小心关闭浏览器”时 web 服务器并不知道。这不同于C/S网络的程序。
      

  25.   

    只知道用IP试试,限制吧!BAIDU搜