同一账号一人登录后,另外的人不能用同一账号登录,如何实现?

saimen2002 2002-05-17 08:23:04
RT
...全文
154 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
z196425545 2010-05-31
我也被这个问题所困扰
回复
jyc_nj 2002-05-20
: )补丁也没什么不好吧,更不能是象你所说的不可取.至于php.exe是否有漏洞,真的建议你不要以为这是什么可以支持你的证据,好东西里面,哪个没有补丁?软件的升级不都可以看作是一次在的补丁?再说下去,可就偏帖太多了,就真的成了误导了.:)
你太在意这些字面上的东西了:)
我想你说的那些(技术上的东西)还是很有道理的,而且和大家说的也并不相悖吧,我以为,你说的应该是给我们在具体操作时的补充,也就是提醒,我们在给置标志在给flag赋值时,要小心资源共享的安全问题,要保证同一时刻只能有一个线程(win32)访问同一个资源或代码. 是的.你注意到了细节.
回复
anybody1 2002-05-20
补丁,说白了就是拆东墙补西墙的东西,建议最好不要。要不然要系统工程师干嘛呢?一个很庞大的系统改一下是什么概念啊!
还有你说的原子操作,要是已经保证原子操作了,还哪来这些东西,不就什么问题也没有了吗~~
你说php.exe是吧,哦忘了告诉你了是有漏洞的~
回复
jyc_nj 2002-05-20
哦,是这个串行方法啊:)
"只能一个包一个包的来"? 我想你的意思大概是说,因为有这么一个很重要的认证过程,所以大家的请求都只能排着队,一个接一个来.所以'电话忙'也很正常.
:)这很象电信的一贯作风,"用户的要求算什么,我作不到的就说明这要求不合理的".而这种居高临下的说话方式,看来很容易传染么.
开个玩笑,别在意:)
我想,其实问题就在于,不管是串行还是并行,'认证'的过程都要保证是原子操作,再细点大概也就是对一个flag的操作吧,且不管它是在硬盘文件,还是内存里.而用PHP这种"并行方式"的东东,确会有很多操作我们意识不到是并发的.但这并不表示问题解决不了,否则也会有相关的补丁出来.请相信这一点. 而且不要忘了php.exe这个服务端程序,它一定可以实现你那个"一个包一个包来"的功能,其实不需要,有个象CMutex这样的东东,不就行了?我对php知之不多:)
回复
anybody1 2002-05-20
不明白是吗?
好,还是以前的例子,你可以在不同的机器上用同一个oicq号码登陆,你可以用同一个电话卡号打不同的电话吗?如果有分机,你可以同时打给不同的电话号码吗?
我想知道你在不在家,我只要打个电话给你,就知道了。和我想让你的电话号码当占线的时候别的任何人不能使用是同一回事吗?
回复
anybody1 2002-05-20
判断在不在线和 “同一账号一人登录后,另外的人不能用同一账号登录” 是两个完全不同的概念 你自己应该明白的 啊是啊?
回复
jyc_nj 2002-05-20
to anybody1(随便编一个) :
让你见笑了.:)
我的确不知道电话收费系统的server和OICQ的server有什么区别,也不知道这里的并行和串行指什么个概念,就象您也不知道为什么没有见过我,而我却有这么点分一样.但是,如果您觉得我这番看法有误导害人之嫌,那真的还要请您能再不吝口水一下,因为,我也不想就这样误导了自己还要背上害人罪名,更因为,我也只是为了用PHP写个东西才转来这里看看的,本来就是门外看热闹,提看法时也是提了心掉了胆的,现在,是不是让您笑的更厉害了?:)
说了些自己不知道错的话,又挨了棒喝,足以让我汗颜,但是,好在CSDN上,言者无过,只为学习,让我即使面对"你还说......"这样的行话,也能用"好在我们之前隔了n层防火墙之类,同一IP下可能会有许多用户(to samoonm)"安心了自己.
我想我说如何查一个人在不在线,无非是想判断这个人是否退出了,以便解决unlock的问题(不知道我用了这么多非php的词,是否让您反了感,sorry).
回复
anybody1 2002-05-20
你们说的都是前台的东西,什么ip啊,标志位啊flag,什么session啊。。。。
这些都是随便的,你怎么做都可以。
这个问题的关键是:服务器认证的问题。
php是无法做到的,只有让他的服务器端改为串行通讯,即,只能一个包一个包的来(避免因为在一定的时间误差内,用户用两台机器,同时按enter键,一个帐号干不同的事)这就是连通的电话业务为什么有时候,为什么总是说,电话忙请稍后再拨,没有东西是十全十美的,这就是放弃效率而提高安全性的原则
回复
samoonm 2002-05-19
记录用户登录是的IP,
那其他人使用同一帐户登录时:
比较一下IP地址不就可以防止其他人同时登录咯~
回复
hucool 2002-05-18
在登陆之前先查询数据库!
回复
genbin 2002-05-18
我的做法也是刷新,在PHP里只能这样做了
做法和jekend(jekend)讲的差不多,
锁记录也是个办法,不过异常情况时,记录一旦被锁,很难解锁,要到数据库的控制台(本地或远程的)将数据库的一个进程kill掉,这条记录才会解锁
如果用jsp就好多了,大家知道,有个叫推的技术,可以知道用户是在线状态,也就可以判断用户是否已经登录了
回复
zyme 2002-05-18
记录session,检查session,同内容session,error!
回复
anybody1 2002-05-17
不懂,就不要装懂~
这是要看你的服务器端是怎么设置的,跟你的脚本没有任何关系
要看是并行设置还是串行设置
回复
benjamin9 2002-05-17
这样恐怕不好吧:
你不知道用户何时离开网站啊,也就是说,你什么时候去修改flag为0啊?
如果说是强迫用户按下“注销登录”,才去修改flag为0的话,那么用户直接关闭了IE或者干脆关了计算机,那么flag就一直为1 ,下一次谁都无法进去,这个用户帐号就作废了。
回复
Drate 2002-05-17
至于用户什么时间退出,可以用论坛统计在线用户的方法,设定一个时间段,同时记录用户的IP地址,时间一到就对用户的状态进行刷新,这样就可以了。
回复
jekend 2002-05-17
jyc_nj(老蔣) : 其實用戶甚麼時候退出了,server 也是不知道的. session 失效只是用戶超過指定時間沒有訪問,而已,可能並沒有關閉瀏覽器 .
可以這樣處理:
數據庫增加一個欄位 , lastAccess .上次訪問時間
在站點內的所有頁面加入一個隱藏的 <frame> 高度,寬度均為0. 這個 frame 的 src 為站內的一個php文件 ,php文件負責更新 lastAccess . 定時刷新這個 frame .
用戶登入時,判斷 lastAccess 欄位 .
回复
jamsband 2002-05-17
上面的办法可以,也就是一种锁表的方法,但是这个要注意一点,就是一旦用户退出要把值改回来,但是还要考虑用户不是正常退出,那样的话就需要你进行监测,或者定时改变这个值.也就是设定一个时间段,一旦时间到了就把值改回来.明白了吧
回复
jamsband 2002-05-17
上面的办法可以,也就是一种锁表的方法,但是这个要注意一点,就是一旦用户退出要把值改回来,但是还要考虑用户不是正常退出,那样的话就需要你进行监测,或者定时改变这个值.也就是设定一个时间段,一旦时间到了就把值改回来.明白了吧
回复
jyc_nj 2002-05-17
对啊,这就象很多程序语言里面的lock功能,先进来的lock一下.
不过,unlock就成个问题了,好象无法知道用户什么时候退出了.其实server系统是肯定知道的,不然怎么会有例如session失效的功能,但程序中如何得知?
如果能知道session什么时候结束,应该就可以当作这个用户退出了,不管他是正常退出的,还是连接中断了.有什么函数可以知道?
实在不行,可以定时刷新网页,记下当前刷新时间,如果下次进来当有另一个用户进来时,判断先前的用户是否已过刷新间隔,为true,则认为先前用户已退出
回复
Drate 2002-05-17
用这个办法试试:
用用户数据表中加入一个字段 :uflag,默认值 为0

当用户登录时,先检查uflag这个值 ,如果为1,则不能登录,如果为0的话则可以登录,用户登录时,将uflag字段置为1。这样其它用户就不能再登录了。
回复
加载更多回复
相关推荐
发帖
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2002-05-17 08:23
社区公告
暂无公告