以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [分享]新手,分享一个防止多人重复登录的方法 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=59360) |
-- 作者:mxm121 -- 发布时间:2014/11/3 1:16:00 -- [分享]新手,分享一个防止多人重复登录的方法 功能比较简单 就是不允许一个用户在多地或者在一台电脑上重复登录 功能实现了 但不一定是最好的方法,在论坛上搜了下,没有特满意或者有些我看不懂,于是花了一晚上搞了个,希望大家提提意见 代码中有个用插入代码框括出来的应该写成cmd.Conne ctio nNa me = "sql"但是论坛有问题,这段代码直接专程cmd.C的输出了 创建了一个用户登录状态表 在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 -- 发布时间:2014/11/3 1:27:00 -- 在计划管理里 开发者会定期刷新这个表 通过表也可以当作查看当前登录系统用户的信息 这个表稍微修改一下,也可以作为登录日志 refresh_time 就是退出时间 computer_ID可以记录哪台机器登录的
|
-- 作者:lyfxybc -- 发布时间:2014/11/3 7:03:00 -- 好东西,顶 |
-- 作者:飞飞 -- 发布时间:2014/11/3 8:36:00 -- 10秒的频率太高了,局域网还行,互联网会有问题 |
-- 作者:Bin -- 发布时间:2014/11/3 8:40:00 -- 间隔改长点,减少资源消耗. 赞一个,谢谢分享 |
-- 作者:九易六 -- 发布时间:2014/11/3 15:50:00 -- 大体看了一下,思路很棒。先顶一下,回头慢慢看。 |
-- 作者:qianqian1530 -- 发布时间:2014/11/19 21:07:00 -- 用不着这么 麻烦吧... 在用户表里添加个 登录列, 当用户登录的时候 变成1, 退出,或者 非正常退出的时候,改成0, 不就可以了么? |
-- 作者:998168 -- 发布时间:2014/11/19 22:54:00 -- 以下是引用qianqian1530在2014-11-19 21:07:00的发言: 用不着这么 麻烦吧... 在用户表里添加个 登录列, 当用户登录的时候 变成1, 退出,或者 非正常退出的时候,改成0, 不就可以了么? 非正常退出,改成0 说得这么轻松啊,比如突然断电了你还让电脑怎么改成0呢?
|
-- 作者:tennis -- 发布时间:2014/11/20 7:05:00 -- 本案例确实大家都用到会有需求,如果foxtable本身于项目属性增加进去(true/false),那该有多好. [此贴子已经被作者于2014-11-20 7:05:54编辑过]
|
-- 作者:cpyh -- 发布时间:2016/9/9 16:25:00 -- mark |