| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 502 人关注过本帖, 1 人收藏
标题:大家如何避免重复登录问题?
只看楼主 加入收藏
yafengliang
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2016-2-21
结帖率:60%
  问题点数:0  回复次数:11   
大家如何避免重复登录问题?
后台SQL数据库,请教如何避免同一个用户在不同电脑上重复登录?

[此贴子已经被作者于2018-5-13 13:03编辑过]

2018-05-12 13:15
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:151
帖 子:6034
专家分:26360
注 册:2014-5-20
  得分:0 
这个问题应该可以在应用软件里处理好
2018-05-13 04:16
yewxj
Rank: 2
等 级:论坛游民
威 望:1
帖 子:110
专家分:61
注 册:2015-6-18
  得分:0 
如果是我做,就在SQL数据库用户表中增加用来记录用户登陆状态的字段,用户登陆和退出时,程序登陆和退出时,修改此标识用来记录用户在线状态,同时增加记录用户登陆时的MAC地址字段。
正常退出时,修改登陆标识字段成退出状态,下次任何机器都可以登陆。
如非正常退出,会导致数据库记录的登陆标识不能修改成退出状态,但下次以相同MAC地址主机登陆,仍可以正常登陆,如换机器(MAC地址不同),则提示用户已在线,或联系管理员清除 在线状态。

[此贴子已经被作者于2018-5-14 20:45编辑过]

2018-05-14 20:13
厨师王德榜
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:437
专家分:1572
注 册:2013-2-16
  得分:0 
楼上的思路可行,工作中我们也是类似的方法。。。
2018-05-14 22:54
hyswcyh
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:357
专家分:866
注 册:2004-11-23
  得分:0 
十豆三老师的回复!
https://bbs.csdn.net/topics/70404628


在VFP中通过Windows WMI获取CPU序号、硬盘序号及网卡MAC的方法

-------------------------------------------------------------------

在很多论坛上一搜索,发现目前大部分VFP获取本地硬盘、CPU及网卡的“唯一ID”都使用了外部的DLL或者是其他的方法,特查阅了很多的资料,成功通过Windows WMI来获取这些我们需要取的硬件信息,其方法如下:
如果是WIN98系统,将需要从 MSDN 下载并安 WMI


LOCAL oWMI AS OBJECT,oLocal AS OBJECT,oHARDWARE AS OBJECT,object1 AS OBJECT,lcCPUID,LcMAC,lcHDID,lcSerial
oWMI=CREATEOBJECT("WbemScripting.SWbemLocator")
oLocal=oWMI.ConnectServer(".", "root\cimv2")

oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_Processor")
FOR EACH object1 IN oHARDWARE
lcCPUID=object1.Properties_('ProcessorId').VALUE
EXIT
ENDFOR

oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_PhysicalMedia")
FOR EACH object1 IN oHARDWARE
lcHDID=object1.Properties_('SerialNumber').VALUE
EXIT
ENDFOR

oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=1")
FOR EACH object1 IN oHARDWARE
LcMAC=object1.Properties_('MACAddress').VALUE
EXIT
ENDFOR
?'CPU序号:',lcCPUID
?'硬盘序号:',lcHDID
?'网卡MAC地址:',LcMAC


以上所获取的都只是第一个硬件的“唯一ID”,如果想要获取更详尽的,稍微修改For...Next之间的语句即可!

[此贴子已经被作者于2018-5-16 08:25编辑过]

2018-05-16 08:23
yewxj
Rank: 2
等 级:论坛游民
威 望:1
帖 子:110
专家分:61
注 册:2015-6-18
  得分:0 
oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=1")
FOR EACH object1 IN oHARDWARE
    _IPAddr = object1.IPAddress[0]    &&IP地址
    _MACAddr = object1.Properties_('MACAddress').VALUE    &&MAC地址
    EXIT
ENDFOR

在获取MAC地址里面增加一条获取IP地址
2018-05-16 09:28
厨师王德榜
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:437
专家分:1572
注 册:2013-2-16
  得分:0 
我个人理解,这个跟获取MAC关系不大,因为他问的是避免同一用户多次登陆。那么他所说的“同一用户”是指什么呢?我理解是指 两台电脑的用户,如果共用一个用户ID,密码,要登陆进系统,系统在接受第一个登录之后,拒绝第二个人登录。所以,这个问题跟获取MAC这些硬件字符串,以取得一个唯一值,不是同一问题。同一用户 可以在不同电脑上登录,只要保证此时此刻只有他一人在线就行,不同电脑也可以是同一用户。
2018-05-16 21:52
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:78
帖 子:2508
专家分:6092
注 册:2015-3-25
  得分:0 
-- 以下都是SQL数据库语法
-- 建立表格和测试数据

/*
-- 用户信息表
create table LoginUser(UserId varchar(6),UserName varchar(20),PassWord varchar(20))
insert into LoginUser
select '1001','张三','111111' union all
select '1002','李四','222222' union all
select '1003','王五','333333'

-- 登录状态表

create table LoginSys(UserId varchar(6),UserName varchar(20),LoginTime datetime,LoginMac varchar(36),OnLine bit)
insert into LoginSys
select '1001','张三','2018-05-17 09:17:55.463','111111',1 union all
select '1002','李四','2018-05-17 09:18:18.060','222222',1
*/


-- 查询测试
declare @UserId varchar(6),@PassWord varchar(20),@LoginTime datetime,@LoginMac varchar(36)
set @UserId = '1001'
set @PassWord = '111111'
set @LoginTime = getdate()
set @LoginMac = '111111'

select a.UserId,a.UserName,a.PassWord,b.LoginTime,b.LoginMac,b.OnLine,
  case when b.OnLine is null or b.OnLine = 0 then 1     -- 没登录过或者已经退出登录
       when b.LoginMac = @LoginMac then 1               -- 在本机登录,可以再次登录
       when dateadd(mi,5,getdate()) >= LoginTime then 1 -- 超过5分钟没刷新在线时间
       else 0
  end as LoginPass
from LoginUser as a
left join LoginSys as b on a.UserId=b.UserId
where a.UserId=@UserId


[此贴子已经被作者于2018-5-17 11:32编辑过]

2018-05-17 11:28
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:78
帖 子:2508
专家分:6092
注 册:2015-3-25
  得分:0 
根据上楼的查询方法,可以根据查询结果LoginPass的值,把上楼做成存储过程,可以做成2中形式的存储过程
1.有返回值的存储过程
2.无返回值,但返回表结果
上楼的只是在登录时查询,是否可以登录,如果能登录,还要做登录登记.
如果没登录过的(OnLine = null),要插入数据,
如果登录过的(OnLine = 0 或1),现在可以登录,就要更新信息




[此贴子已经被作者于2018-5-17 11:38编辑过]

2018-05-17 11:32
yafengliang
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2016-2-21
  得分:0 
现实中就是7楼说的情况。一个帐号可以在不同的电脑上登录,但应避免同时有两台电脑用同一帐号登录。其实就是怎么处理非正常退出时,在线状态如何切换的问题!
2018-05-19 00:26







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.070880 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved