您的位置:程序门 -> .net技术 -> c#



关于同一帐号禁止多人同时登陆的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于同一帐号禁止多人同时登陆的问题[已结贴,结贴人:lxings]
发表于:2007-05-27 14:39:32 楼主
要求如果一个已经在一台机器上登录了,其他机器上就不能登录
目前的做法是在数据表中用一个字段记录登陆状态,比如0代表没登陆,1代表登陆,任何帐号登陆是都判断一下。
问题是无法保证用户意外退出的时候及时更改状态,请各位高手给点意见。
发表于:2007-05-27 14:43:181楼 得分:0
这个只能用cookies记录用户的登陆状态(当然要设置过期时间),像动网的都是这样判断在线用户的
发表于:2007-05-27 14:46:142楼 得分:0
在重新登录的时候判断若是1的话就获取一下客户端的信息,看是否存在,不存在就重新登录,若存在就返回已登录的信息.
发表于:2007-05-27 14:55:243楼 得分:0
那这样吧,先不管意外掉电的问题。
假设甲用户成功登陆后,长时间未进行任何操作,这是如果他再点击任何页面,都提示“登陆超时”,自动返回登陆页面要求重新登陆。(这时要清空他的登陆标志,问题是这时session已经超时丢失了,应该怎么做?),
发表于:2007-05-27 14:55:514楼 得分:0
用cache...
发表于:2007-05-27 14:58:345楼 得分:0
to:windstore
如何用??能否用代码说明,谢谢啊~~~~~~~~~~
发表于:2007-05-27 15:58:226楼 得分:0
mark 一会儿过来看结果 我也想学习一下~
发表于:2007-05-27 16:00:207楼 得分:0
可以这样     如果有第二个登录     先前那个登录就会无效
这样会好实现一点
发表于:2007-05-27 16:20:248楼 得分:0
谁能具体说说呀,不甚感激!!!
发表于:2007-05-27 18:42:139楼 得分:0
ding
发表于:2007-05-27 21:16:2710楼 得分:0
在重新登录的时候判断若是1的话就获取一下客户端的信息,看是否存在,不存在就重新登录,若存在就返回已登录的信息.


似乎这个已经说得很明白了吖,你后面提的问题也包含在此设计中啊。

你可以在程序内设置一个内置命令,比如ok,如果程序接收到服务器发回的“ok”命令后,返回 "ok ",如果服务器收到ok,那证明此帐号已经登陆,并且在活动状态,反之既然。
发表于:2007-05-27 22:12:4611楼 得分:0
学习一下~
发表于:2007-05-27 22:52:5012楼 得分:0
可以使用http管道技术
发表于:2007-05-28 00:07:3513楼 得分:0
mark     等下来看~
发表于:2007-05-28 00:59:4014楼 得分:10
判断是否单点登录的代码

int   i=checklogin(name,pwd);//验证用户名密码是否正确,如果正确,返回值为1

if(i> 0)   //如果存在该用户
{
      string   str_key=name+ "_ "+pwd;
      string   str_user=convert.tostring(cahe[str_key]);   //检查cache
      if(str_user==string.empty)     //如果不存在该cache,说明未登录
      {
              timespan   sesstimeout=new   timespan(0,0,session.timeout,0,0);
              cache.insert(str_key,null,datetime.maxvalue,sesstimeout,cacheitempriority.notremovable,null);
            session[ "user "]=name;
      }
      else
      {
              response.write( "你已经登录! ");
        }
}
发表于:2007-05-28 08:03:4115楼 得分:0
mark!
发表于:2007-05-28 08:17:5616楼 得分:0
mark.
這個問題我也考慮過,但還是沒有解決。
发表于:2007-05-28 08:37:0017楼 得分:0
mark,收藏下....
发表于:2007-05-28 08:50:3418楼 得分:0
可以用cache(失效时间与session或cookies的失效时间一致),具体做法看一下孟子的单点登录示例.
发表于:2007-05-28 09:01:3419楼 得分:0
风过无痕
发表于:2007-05-28 09:49:3020楼 得分:10
我以前做过     不过实现的思路和你的要求有点不同~      
现在一般实现都是2种思路     一个是有登陆则其他人不可能登陆     另一种是新登陆后则前一个掉线

第一种方法你们一直在说的     思路差不多     我就不说了
第二种方法我说下我的思路吧~       主要利用客户与服务器的通讯,因为每次操作都会发生通讯   至于超时等问题可以不去考虑~     当用户登陆就在服务器对该客户生成随即数或者将部分信息写入数据库都行     然后每次通讯判断是否来自这个点     不是则踢出     可以确保只有一个人在线     还不容易出现bug     现在用这个方法的人很多     你可以用数据库做也可以用application做     都很方便
发表于:2007-05-28 10:16:4921楼 得分:0
mark
发表于:2007-05-28 10:19:5122楼 得分:0
学习一下~
发表于:2007-05-28 10:20:3223楼 得分:0
我觉得这个问题,   csdn上做得蛮好的,       你只要打开了,   一天不登录,   也算你登录了,不管你是怎么关的,     他也不会说已经登录,   呵呵  

但好像就是没有识别不可以多点登录
发表于:2007-05-28 11:13:3224楼 得分:0
学习
发表于:2007-05-28 11:33:1925楼 得分:0
一直考虑,没有思路
发表于:2007-05-28 11:40:0826楼 得分:10
http://blog.csdn.net/lioncf/articles/625553.aspx


private   void   login_click(object   sender,   system.eventargs   e)
{
    //   作为唯一标识的key,应该是唯一的,这可根据需要自己设定规则。
    //   做为测试,这里用用户名和密码的组合来做标识;也不进行其它的错误检查。  

    //   生成key
    string   skey   =   username.text   +   "_ "   +   password.text;
    //   得到cache中的给定key的值
    string   suser   =   convert.tostring(cache[skey]);
    //   检查是否存在
    if   (suser   ==   null   ¦ ¦   suser   ==   string.empty)
    {
        //   cache中没有该key的项目,表名用户没有登录,或者已经登录超时
        //   注意下面使用的timespan构造函数重载版本的方法,是进行是否登录判断的关键。
        timespan   sesstimeout   =   new   timespan(0,0,system.web.httpcontext.current.session.timeout,0,0);
        httpcontext.current.cache.insert(skey,skey,null,datetime.maxvalue,sesstimeout,
            system.web.caching.cacheitempriority.notremovable,null);
        session[ "user "]   =   skey;
        //   首次登录,您可以做您想做的工作了。
        msg.text= " <h4   style= 'color:red '> 嗨!欢迎您访问 <a   href= 'http://dotnet.aspx.cc/ '> 【孟宪会之精彩世界】 ";
        msg.text   +=   " </a> ,祝您浏览愉快!:) </h4> ";
    }
    else
    {
        //   在   cache   中发现该用户的记录,表名已经登录过,禁止再次登录
        msg.text= " <h4   style= 'color:red '> 抱歉,您好像已经登录了呀:-( </h4> ";
      return;
    }
}

发表于:2007-05-28 11:54:4027楼 得分:0
我建议,你可以用一个单独的东西(表、文件),来单独记录用户在线的情况;特别记录上次活动时间;
然后在你的主程序里面,做一个单独的不影响当前页面的页面(iframe等),周期性地写入上面的里面;
如果每次有session产生的时候,都检查   now   -   上次活动时间   >   周期?不在线:在线;
发表于:2007-05-28 13:03:5628楼 得分:0
问题是无法保证用户意外退出的时候及时更改状态,请各位高手给点意见。

加个session退出事件不就可以了吗
发表于:2007-05-28 13:08:3229楼 得分:0
对   session可以的
发表于:2007-05-28 13:46:5330楼 得分:0
mark
学习下
发表于:2007-05-28 13:47:1031楼 得分:0
顶顶顶,学习一下...
发表于:2007-05-28 13:49:2832楼 得分:0
我们曾经也做过这样一个例子.不过效率比较麻烦

使用数据库临时表.如果用户登录.那么新建该用户登录的临时表信息.用户退出或意外退出.临时表删除

其它用户登录时.判断是否存在该临时表.存在返回已登录.不存在则正常登录
发表于:2007-05-28 13:53:1833楼 得分:0
mark
发表于:2007-05-28 14:03:0334楼 得分:0
mark
发表于:2007-05-28 14:27:1235楼 得分:0
帮顶!
发表于:2007-05-28 15:04:4736楼 得分:0
mark

用catch来做的话,岂不是要定时刷catch
发表于:2007-05-28 15:10:3237楼 得分:0
你有session的目标,是为周期写那个文件,表示,我在检测周期内,还是在线的;当然,退出了,自然     now   -   上次的活动时间   >   周期了;
发表于:2007-05-28 15:18:0038楼 得分:0
mark
发表于:2007-05-28 15:26:1239楼 得分:10
在bs架构里很难实现的,要是只有一台web服务器还好,觉得session   cache   application不好用就自己构建一个表态类嘛.无非就是存一个用户标识,一个最后访问的时间,然后判断是否有这条用户的相关标识,有就再判断最后访问的时间,长了就把原来的设为过期,短了就表示用户还在使用.
具体实现不会太难的.

        不过,多台机器轮巡怎么样办.
发表于:2007-05-28 15:34:4740楼 得分:0
mark
发表于:2007-05-28 15:39:1941楼 得分:0
绑定
发表于:2007-05-28 15:47:4142楼 得分:0
cache方法我刚试过,但是如何解决session的及时关闭?
发表于:2007-05-28 15:56:2443楼 得分:0
application里面登陆后锁定
发表于:2007-05-28 16:24:4544楼 得分:0
这个问题我以前也看到过
我是这么解决的
js事件函数有一个可以判断浏览器关闭的事件  
如果用户在未正确退出而关闭浏览器的话
可以给与提示
发表于:2007-05-28 16:34:5045楼 得分:0
学习啊。...
发表于:2007-05-28 17:20:2846楼 得分:0
用arraylist
发表于:2007-05-28 17:48:4247楼 得分:10
request.getsession(true).setattribute( "istimeout ",   "false ");

//   在login.jsp中放入session中的标志   如果session过期   这个标志取出为null
if   (session   ==   null   ¦ ¦   session.getattribute( "istimeout ")   ==   null){
将1改为0就行了。
发表于:2007-05-28 17:50:1648楼 得分:0
所有的非法关闭都可以获取的。就看你的程序怎么去获取。
发表于:2007-05-28 18:37:0949楼 得分:0
多谢各位,暂时结帖,继续考虑ing。
新注册,分不多,望见谅!!
发表于:2007-05-28 19:00:5950楼 得分:0
mark学习
发表于:2007-05-28 19:01:4651楼 得分:0
定时刷新页面,收集在线用户信息,保存到服务器进行检查
发表于:2007-05-28 19:05:1352楼 得分:0
mark
发表于:2007-05-28 21:17:2053楼 得分:0
学习。。。。
发表于:2007-05-28 22:30:5854楼 得分:0
cache,单点登录
发表于:2007-05-28 23:32:4255楼 得分:0
mark
发表于:2007-05-29 09:29:2056楼 得分:0
mark
发表于:2007-05-29 12:26:5657楼 得分:0
收藏...以写winform用一个timer,每过一段时间进行检查的,asp.net不知道能不能用.
发表于:2007-05-29 17:48:0258楼 得分:0
mark
发表于:2007-05-29 21:45:2459楼 得分:0
希望看到java的解决方案..包括application和数据库两种
发表于:2007-05-29 22:54:0460楼 得分:0
mark   2
发表于:2007-05-30 14:04:1261楼 得分:0
学习一下
发表于:2007-06-01 22:07:2562楼 得分:0
make
发表于:2007-06-02 10:01:4663楼 得分:0
我也想学习一下
发表于:2007-06-02 10:40:1464楼 得分:0
学习一下……
发表于:2007-06-02 14:48:2465楼 得分:0
good
发表于:2007-06-02 19:25:4866楼 得分:0
问题是无法保证用户意外退出的时候及时更改状态
用ajax异步调用,在客户端定期发出请求,然后服务器在每次请求时记下服务器时间,当登入登入时只要比较当前服务器时间与最近更新记录下来的时间的间隔是否超过设定请求时间时间间隔,如果超过了就表明不在线不管意外与否,在此之内就表示在线拒绝登入
发表于:2007-06-03 23:05:3567楼 得分:0
mark
发表于:2007-06-04 15:27:0268楼 得分:0
在数据库中设置一个登陆状态的属性,
每次登陆就设置成1,退出改回成0就可以了
这样就比较简单了
发表于:2007-06-05 08:55:5969楼 得分:0
同意   zmy12007()   老兄的意见~
使用ajax   定时向服务器提交在线验证,服务器将用户的验证信息存在静态的hashtable里
key存用户的唯一标识比如用户名之类的,value存用户提交验证的时间。
服务器端使用一条线程每隔一段时间扫描一次hashtable如果将超时的用户删除。
用户在登陆的时候也向服务器请求此用户是否已登陆,直接向hashtable查一下就行了。
这样做的好处就是不管用户是否正常退出服务器都能将超时的用户清除。
缺点就是开销有点大如果登陆的用户比较少还可以,太多了就不好说了没测试过。
我们公司在项目中都是这样解决的。
发表于:2007-06-06 09:31:3670楼 得分:0
如果你用的是sql
那么...sql的全局临时表可以解决这个问题
每当用户登陆.就以用户id为表号..建一个全局临时表!~用户退出,你就删除这个临时表
不用担心这个临时表,因为当用户断开连接的时候
sql会自动回收这个临时表!
所以断电啊.意外什么的.也都没问题!~
发表于:2007-06-25 08:49:2971楼 得分:0
mark
发表于:2007-06-25 16:12:1072楼 得分:0
mark,收藏下....
发表于:2007-06-28 23:18:3073楼 得分:0
关于突然断电的情况。我有一个方法,不知道ok不ok。。
一个专门表。记录在线用户的。。。表有个自自动编号id。
当登陆的时候。。session( "user_id ")=rs[ "id "]
这个是用来保存用户表中id的。。
同时用application保存所有id。为什么?呆会会讲到。
application( "user_ "+rs[ "id "])=rs[ "id "]

当有另外一个客户登陆的时候。
先判断当前表中有没有此客户存在。如果存在。则删除客户的信息。
重建新客户的信息。
删除表中的同时。也删除客户application( "user_ "+rs[ "id "])的信息。
=====================================================

这样只要所有用户在活动的时候。都进行一个简单的判断。
if(session( "user_id ")!=application( "user_ "+rs[ "id "]))
      messagebox.show( "在别处已登陆了你的帐号! ")

不知道这种方法如何?
发表于:2007-06-28 23:20:1774楼 得分:0
补。因为是自动编号,所以不可能有同样的“application( "user_ "+rs[ "id "])
或:session( "user_id ")


快速检索

最新资讯
热门点击