Foxtable(狐表)用户栏目专家坐堂 → [分享]新手,分享一个防止多人重复登录的方法


  共有10666人关注过本帖树形打印复制链接

主题:[分享]新手,分享一个防止多人重复登录的方法

帅哥哟,离线,有人找我吗?
mxm121
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:392 积分:3026 威望:0 精华:0 注册:2014/9/20 23:56:00
[分享]新手,分享一个防止多人重复登录的方法  发帖心情 Post By:2014/11/3 1:16:00 [只看该作者]

功能比较简单 就是不允许一个用户在多地或者在一台电脑上重复登录 功能实现了 但不一定是最好的方法,在论坛上搜了下,没有特满意或者有些我看不懂,于是花了一晚上搞了个,希望大家提提意见

代码中有个用插入代码框括出来的应该写成cmd.Conne ctio nNa me = "sql"但是论坛有问题,这段代码直接专程cmd.C的输出了


创建了一个用户登录状态表

图片点击可在新窗口打开查看此主题相关图片如下:无标题.jpg
图片点击可在新窗口打开查看

在afteropenproject添加如下代码,每次登录添加一条记录,同时将同用户名的其它登录记录的state置0

'--------------------添加用户登录状态表,用以限制客户端同时只能登录一次-----------------------
Dim cmd As New SQLCommand
Dim dt As Date
cmd.Conne ctio nNa me = "sql"           ‘论坛有问题,直接贴出来会变成cmd.C 使用的时候把空格去掉
cmd.CommandText = "Select GetDate()"
dt = cmd.ExecuteScalar()

'----------------生成登录状态编号, 便于后续查找-----------------
Dim i As String = DataTables("用户登录状态表").sqlCompute("max(Num)")
Dim idx As Integer
If i > "" Then
    idx=i+1
Else
    idx=1
End If
'----------------生成登录状态编号, 便于后续查找-----------------
_login_num = Format(idx,"0000")


With Tables("用户登录状态表")                '将新登录用户信息写入
    .AddNew
    .Current("Num") = Format(idx,"0000")
    .Current("user_ID") = User.Name
    .Current("computer_ID") = ComputerId
    .Current("login_time") = dt
    .Current("refresh_time") = dt
    .Current("state") = 1
    .Current.save
End With

'查找登录信息中用户名与登录名相同的记录,将所有不属于本次登录的记录state置0
Dim drs As List(of DataRow)  = DataTables("用户登录状态表").SQLSelect("user_ID = '" & user.Name & "'")
If drs IsNot Nothing Then
    For Each dr As DataRow In drs
        If dr("login_time") <> dt Then            ‘只要登录名相同,登录时间和本次不一样的 全都置0
            dr("state") = 0
            dr.Save()
        End If
    Next
End If


做一个计划管理  我设置的10秒查询 如果发现自己的登录信息state被置0 则强行退出  如果state为1 则刷新时间 

Dim dr As DataRow = DataTables("用户登录状态表").SQLFind("Num = '" & _login_num & "'")
If dr IsNot Nothing Then
    If dr("state") = "1" Then
        Dim cmd As New SQLCommand
        Dim dt As Date
        cmd.Conne ctio nNa me = "sql"           ‘论坛有问题,直接贴出来会变成cmd.C 使用的时候把空格去掉
        cmd.CommandText = "Select GetDate()"
        dt = cmd.ExecuteScalar()
        dr("refresh_time") = dt
        dr.Save
    Else
        MyTimers("查询用户登录状态").Enabled = False '防止不停跳出提示窗口
        Messagebox.show("账号:" & user.Name & " 在其它地方登录,系统将被强行退出,如有异常,请联系管理员","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
        Syscmd.Project.Exit(False)
    End If
Else
    Messagebox.show("账号:" & user.Name & " 由于登录状态信息不存在,系统将被强行退出,请重新登录系统,如有异常,请联系管理员","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
    Syscmd.Project.Exit(False)
End If

If User.Type = UserTypeEnum.Developer Then
    DataTables("用户登录状态表").LoadFilter = ""
    DataTables("用户登录状态表").Load
End If

在beforcloseproject添加如下代码  用来清除正常退出或者强制退出的本次登录生成的记录  同时将属于同用户登录的其它记录中state为0的(不正常退出)的记录都清除

'删除本次登录状态记录
Dim dr As DataRow = DataTables("用户登录状态表").SQLFind("Num = '" & _login_num & "'")
If dr IsNot Nothing Then
    dr.Delete
    dr.Save
End If

'查询是否有状态记录用户名等于本次登录用户名且state为0的记录,如果有则清除,以此消除非正常退出留下的记录
Dim drs As List(of DataRow)  = DataTables("用户登录状态表").SQLSelect("user_ID = '" & user.Name & "'")
If drs IsNot Nothing Then
    For Each dr1 As DataRow In drs
        If dr1("state") = "0" Then
            dr1.Delete
            dr1.Save()
        End If
    Next
End If
[此贴子已经被作者于2014-11-3 15:53:28编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
mxm121
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:392 积分:3026 威望:0 精华:0 注册:2014/9/20 23:56:00
  发帖心情 Post By:2014/11/3 1:27:00 [只看该作者]

在计划管理里 开发者会定期刷新这个表 通过表也可以当作查看当前登录系统用户的信息 

这个表稍微修改一下,也可以作为登录日志 refresh_time 就是退出时间   computer_ID可以记录哪台机器登录的

 回到顶部
帅哥哟,离线,有人找我吗?
lyfxybc
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1294 积分:9852 威望:0 精华:0 注册:2012/9/19 21:13:00
  发帖心情 Post By:2014/11/3 7:03:00 [只看该作者]

好东西,顶


 回到顶部
帅哥哟,离线,有人找我吗?
飞飞
  4楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:621 积分:5130 威望:0 精华:1 注册:2014/8/7 6:56:00
  发帖心情 Post By:2014/11/3 8:36:00 [只看该作者]

 10秒的频率太高了,局域网还行,互联网会有问题

 回到顶部
帅哥哟,离线,有人找我吗?
Bin
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2014/11/3 8:40:00 [只看该作者]

间隔改长点,减少资源消耗.    赞一个,谢谢分享

 回到顶部
帅哥哟,离线,有人找我吗?
九易六
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:184 积分:1800 威望:0 精华:1 注册:2009/3/16 14:05:00
  发帖心情 Post By:2014/11/3 15:50:00 [只看该作者]

大体看了一下,思路很棒。先顶一下,回头慢慢看。


 回到顶部
美女呀,离线,留言给我吧!
qianqian1530
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:746 积分:5567 威望:0 精华:0 注册:2013/12/4 8:56:00
  发帖心情 Post By:2014/11/19 21:07:00 [只看该作者]

 用不着这么 麻烦吧...   在用户表里添加个 登录列, 当用户登录的时候 变成1, 退出,或者 非正常退出的时候,改成0, 不就可以了么?

 回到顶部
帅哥哟,离线,有人找我吗?
998168
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:241 积分:2208 威望:0 精华:0 注册:2012/11/21 0:48:00
  发帖心情 Post By:2014/11/19 22:54:00 [只看该作者]

以下是引用qianqian1530在2014-11-19 21:07:00的发言:
 用不着这么 麻烦吧...   在用户表里添加个 登录列, 当用户登录的时候 变成1, 退出,或者 非正常退出的时候,改成0, 不就可以了么?
非正常退出,改成0 说得这么轻松啊,比如突然断电了你还让电脑怎么改成0呢?


 回到顶部
帅哥哟,离线,有人找我吗?
tennis
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1433 积分:10763 威望:0 精华:0 注册:2013/3/29 10:23:00
  发帖心情 Post By:2014/11/20 7:05:00 [只看该作者]

本案例确实大家都用到会有需求,如果foxtable本身于项目属性增加进去(true/false),那该有多好.
[此贴子已经被作者于2014-11-20 7:05:54编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
cpyh
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:191 积分:1785 威望:0 精华:0 注册:2012/8/9 9:18:00
  发帖心情 Post By:2016/9/9 16:25:00 [只看该作者]

mark

 回到顶部
总数 14 1 2 下一页