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


  共有9076人关注过本帖平板打印复制链接

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

帅哥哟,离线,有人找我吗?
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编辑过]

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