一个登陆账号,
只能有一台电脑登陆,
当这个账号在登陆时,
假如另一台电脑用同样的账号登陆,拒绝登陆
如何做到

解决方案 »

  1.   

    http://blog.csdn.net/anchenyanyue/article/details/6825036
      

  2.   

    application 存储USERID和SESSIONID
      

  3.   

    ++++
    在用户注销session或者关闭浏览器的时候再global.asax中的回话结束事件中将那列的标志给修改掉。
      

  4.   


    这样做把浏览器cookie清空以后,哪台电脑都登录不上了。
      

  5.   

    登陆时 获取电脑的MAC地址
      

  6.   

    单点登录用缓存机制也能做到!Cache或者设计数据库给用户表加一个用户心跳时间
      

  7.   

    是bs的还是cs的啊。。IP 行不
      

  8.   

    我也遇到过同样的问题,
    只知道理论,不知道怎么实现。
    用户登录后把用户的session和sessionid到applaction里,下次登录时判断是否已经存在,存在的话就把对应的sessionid找到session销毁,清除cook,然后再添加新的数据
      

  9.   


    哈哈,不必清cookie,只要把浏览器一关,哪台电脑都登不上喽
      

  10.   

    对于 http 协议来说,楼主的需求中可以实现只有一个人保持在线状态,但是实现方式上按楼主的要求实现则会现带很多麻烦因为 http 是断开式的协议,也就是说服务端并不和客户端永久地保持连接。当客户端的请求响应完成之后,服务端就和客户端失去了联系。正因为如此,http协议里才增加了一个我们常用的 cookie,它相当于一个凭证,用来保持多次连接时,客户端或者服务端的状态。
    举个简单的例子,你到银行去存了一笔钱,然后离开柜台(断开连接)。那么你下次去取钱时,柜台服务人员并不认识你,所以银行服务员至少需要知道你的帐号,才能确定你上次、上上次、上上上次……的存钱情况,也就是客户端的状态数据。这个帐号就相当于cookie。cookie 最最基本的原理大概就是这样,客户端每次向服务器提交请求时,会把cookie同时传给服务器,服务器根据cookie值取出上次你保存下来的信息。回到楼主的问题
    如果我已经在 A 地用帐号 Account1 登录,系统标记 Account1 已经登录。
    那么必须给客户提供一个“注销”的操作,服务端会标记 Account1 不是登录状态。
    但是问题是,客户很有可能直接把浏览器关闭,或者客户端死机,死浏览器等等等等,这样服务端就不知道客户已经退出,Account1 依然是登录状态。这样一来,Account1 就再也无法登录了。因此,好的处理方案应该是:如果在 A 地用 Account1 登录之后,我再在 B 地用 Account1 登录,则 B 地登录成功,并且强制注销 A 地的登录状态。就是把 A “踢”出系统。目前QQ不就是这样做的吗?这样的做法可以是:
    服务器保存用户最后一次登录用的 cookie id 值。用户成功登录之后,将自己的 cookie id 值保存到这个用户信息中。如果用户在访问其它页面时,检查用户当前的 cookie id 是否和系统中保存的 cookie id 值,如果系统中的 cookie id 值为空(从来没有登录)或者不相同(已经有人从其它地方登录了),则自动注销,跳转到登录页面。
      

  11.   

    在数据表里面对登录用户增加一个标识字段 弄bit 0 或 1 当用户登录了 就改写状态为 1 表示登录 退出后 改写回 0 。每次登录的时候查询这个字段的值 来判断是否登录
      

  12.   

    正常情况都好弄,不正常情况你要考虑清楚。有个事件 onbeforeunload 可以控制,但是人为刷新的话也会触发这个事件的。
      

  13.   

    我当时做了个发消息的。登陆的时候,先注册IP。退出的时候清空IP。下一次登陆的时候给这IP发消息,能收到回应说明他在线,如果没有消息回应就说明不在线,他或许医材退出了。
      

  14.   

    下面这样的字符串是什么加密算法的加密结果,急求wrvwR67YAh00lZC3baOnnEfV9mqnCYlgZkzj8NvjY+a4fXdnceJ3q2pFCTjAUTiPw69OO4U7D6W4/QpDxkOheunj7T7owazkRKpb1Fno2d8FZSrNW6iHAVdLXSGKudKE46/jRMGb7ztJHynsw==
      

  15.   

    放在session 或者cache 里面好点.
      

  16.   

    哎 这些人 都认为是在学校里面做程序么?都不考虑非正常情况?即使在数据库里面加一个字段,让一个线程一直去跑,看这个用户在线没。如果没在线就改变状态。这种方式百分之百是有bug的,绝对过不了测试这一关。这种方式无法做到及时修改状态。还是20楼的稍微靠谱一点。
      

  17.   

    楼主可以结帖了,楼上的兄弟们已经都回答的很明确了。
    我所知道的,常用的也就两种:
    1、application,这个是全局共享的,所以用户登录后把相关的信息保存后,登录的时候再验证,就能做到一个账户只允许一人登录的需要。
    2、在数据库里给用户表增加一个登录状态的字段。
      

  18.   

    如果是BS的,可以这样做:
    当有用户成功登录进来时,到了主页面了,实现代码
     function showMsg() {
                $.ajax({
                    type: "post",
                    url: "../../../asyn/OnlineUser.aspx?flag=0&data=" + new Date().getTime(),
                    beforeSend: function () {
                    },
                    success: function (data) {
                    },
                    error: function () {
                        //    alert("出错");
                    }
                });
            }
            setInterval("showMsg()", 6000);
    以上代码是每隔一段时间去异步请求下后台,后台处理代码(这里写得比较简单,主要是思路),
      int UserId = Session["UserID"] == null ? 0 : Convert.ToInt32(Session["UserID"]);
    if (UserId > 0 && UserName != "")
                    {
                        //这里是Dictionary<long,UserModel>里存在的,把时间更新更新到最新
                        if (UserManager.dic.ContainsKey(UserId))
                        {
                            //时间更新
                            UserManager.Update(UserId, DateTime.Now);
                        }
                        else    //这里是新进来的用户添加到Dictionary<long, UserModel>
                        {
                            UserModel model = new UserModel();
                            model.UserID = UserId;
                            model.UserName = UserName;
                            model.LastActionTime = DateTime.Now;
                            model.DempName = DepartmentName;                        model.SessionId = Session.SessionID;
                            UserManager.Add(UserId, model);
                        }
                    }到了这里应该可以看得差不多了,就是当前登录成功的用户保存到全局的Dictionary<long,UserModel>
    ,当有用户退出时,删除掉,或者session失效时,删除掉,
    在登录的时候,做下判断
     if (UserManager.dic.ContainsKey(UserId_Dic))
                    {
                        DsCommon.PublicFunction.RegistScript(this.Page, "alert('当前用户处于登录状态,无法重复登录!');");
                        return; 
                    }
    这里要说明的是一个实现思路,有思路就好办了,代码不重要,这些代码也不够,还有很多没提到问题,自己在开发的时候会发现
      

  19.   

    获取SessionID   存起来  登录时 比较
      

  20.   

    放入session里面把 登陆前,先检测里面的数据是否符合!
      

  21.   

    都是净扯蛋的货们,现在CSDN也是一般水军的地方了。除了mysql等几个区,基本上都是净扯蛋。application 是ASP的,如果用的是php  python 咋整?
    搞心跳包是找死,如果网速慢点,心跳没有跟上咋办,让我重新登陆吗?
    写入字段,完全是个SB的作法,脑子里面进面粉了吗?明显不靠谱吗,还用脑子想吗?
    还有用IP的,如果是网吧内,或局域网内咋处理,换个机器后就不让我上了吗?