同一个帐号不能同时登陆的问题

2016-02-19 12:28 19 1 收藏

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享同一个帐号不能同时登陆的问题吧。

【 tulaoshi.com - Web开发 】

〓简介〓
有点常识的人都知道本身用asp做这种功能显然有些牵强,因为他不像qq,msn或irc 聊天室那样是即时通讯,他都是靠刷新网页更改最后活动时间来获取用户是否在线的,所以您不要指望下面这片教程有多完美,我也只是把我的思维模式记录下来,有啥不对的地方还请高手们多多指教!
--------------------------------------------------------------------------------
〓正文〓
首先我先向大家介绍一下我实现这个效果的思路,如果你看过我的思路后就能理解完全没必要将这篇东西看完……

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

实现这个功能我只能想到两种方式来实现:
1。数据库+asp
做起来可能会复杂些,但是适合有大量登陆用户的系统里。

2。application
用application对象:如果你做的是大型社区,你可能要为每个登陆id生成一个appliaction,这样做虽然程序上设计会简单些但登陆用户过多及其耗费服务器资源,我这里决不提倡,因为appliaction对象在用户登陆时生成很容易但是要做到真正的随着用户退出系统完全释放掉,到目前我还没看到更好的方法~

因此还是让我们来看看用数据库+asp是如何实现同一个帐号不能同时登陆的问题的吧!

首先问用户建立数据库这里我们用access新建一个onlyNet118.mdb

数据表1: users 存放用户注册资料
下设数据表:uID(自动编号) userName(字符型) userPass(字符型)

数据表2: onlyLogin 存放用户临时登陆信息
下设数据表: OLname(字符型) OLtime(日期型) OLip(字符型)

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

数据库建好后我们直接向users表中手动添加数据 userName表添加Net118,userPass表里添加111,为了能突出我们本文讨论的重点,去掉不必要的废话,所以密码也不要加密了,用户名也自己添加~哈哈~

好了,现在数据库里面有用户数据库,下面我们来做用户登陆界面,复制下面代码存成onlyLogin.asp文件。
html
head
meta http-equiv="Content-Type" content="text/html; charset=gb2312"
titleNet118.COM禁止同一账号不同地区同时登陆/title
/head
body
form name="form1" method="post" action="loginPost.asp"
用户名:input name="userName" type="text" id="userName" size="15" maxlength="5"
密码:input name="userPass" type="password" id="userPass" size="15" maxlength="15"
input type="submit" name="Submit" value="Login"
/form
/body
/html


完成后在新建一个loginCONN.asp文件复制下面的代码保存!是连接数据库的,这个我就不多解释了……
%

Dim CONN_Net118
Dim Conn_T
Dim mmdd
mmdd="onlyNet118.mdb"
Set CONN_Net118 = Server.CreateObject("ADODB.Connection")
Conn_T="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&mmdd&"")
on error resume next
CONN_Net118.Open Conn_T

%

下面我们做一个loginPost.asp文件也存在这个目录下,这个比较关键,仔细看下面的代码:
!--#include file="loginCONN.asp" --
%
'删除maxTime时间内部活动的用户,maxTime 在loginCONN.asp文件里面已经定义好了
Conn_Net118.Execute("Delete From onlyLogin where DATEDIFF('s',OLtime, now()) "& maxTime & "")
'================================================================
Dim rs, ts, txt, sql, userName, userPass
if Request.Form("Submit")="Login" then
userName=Request.Form("userName")'获取表单用户登陆名
userPass=Request.Form("userPass")'获取表单用户登陆密码
'由于我们这里讨论的不是安全问题所以用户密码都没有加密
Set rs = Server.CreateObject("ADODB.RECORDSET")
sql="SELECT * FROM users where userName = ' "& userName & "' and userPass = ' "& userPass & "'"
rs.Open sql, CONN_Net118,1,1
IF not rs.eof then
Call isOK(userName) ' 用户名密码正确调用次过程,isOK将会在下面的程序中定制。
else
Response.Write("a href=javascript:history.go(-1)用户名或密码错误/a")
Response.End()
end if
rs.Close
Set rs=Nothing
end if
Sub isOK(userName)
Dim Olip ' 数据库中当前登陆用户名保存的ip
Dim Oltime ' 数据库中当前登陆用户名保存的最后刷新网页的时间,是计算用户是否在线的重要数据。
Dim OLip1 ' 记录当前用户登陆ip,用来区分是否为同一用户的标示
OLip1=Request.ServerVariables("REMOTE_ADDR")'取得提交登陆信息用户的IP
Set ts=Conn_Net118.execute("Select * FROM onlyLogin WHERE OLname='"& userName & "'")
if not ts.eof then ' 查询数据库是否有此用户的登陆过的信息
OLtime=ts("OLtime")
OLip=ts("OLip")
if OLip1OLip and DateDiff("s",OLtime,now()) maxTime then
'上句判断如果提交登陆用户ip不是数据库中最后纪录的用户ip并且
'用户的最后活动时间和当前时间相隔并没超过规定的秒数则确认此用户当前在线
Response.Write "a href=javascript:history.go(-1)此用户目前在线,你无法从其他地方登陆此账号!/a"
Response.End()
else
'否则的话判定登陆成功付值给session
Session("lgName")=userName
Session("lgPass")=userPass
Response.Redirect "loginOK.asp"
Response.End
end if
else
'如果数据库没有次登陆用户纪录则执行下面的语句
Dim ls
Set ls=Server.CreateObject("ADODB.RECORDSET")
ls.Open"Select * From onlyLogin",CONN_Net118,2,2
ls.ADDNEW
ls("OLname")=userName
ls("OLip")=OLip1
ls("OLtime")=NOW()
ls.UPDATE
ls.Close
Set ls=Nothing
'判定登陆成功付值给session
Session("lgName")=userName
Session("lgPass")=userPass
Response.Redirect "loginOK.asp"
Response.End
end if
End Sub %
如果你看得懂asp文件一看便知道登陆成功后叶面会跳转到loginOK.asp下面我们马上看看这个叶面的代码吧
style type="text/css"
!--
body {background-color: #FF9900;}
--
/style
% IF Session("lgName")"" then %
您登陆成功了!!!下面是潜入网页内的iframe为的是在规定的时间刷新网页向服务器报告你是否在线
为了便于区分,frame网页我们采用了白色作为底色
iframe border=0 name=new_date marginwidth=0 framespacing=0 marginheight=0 src="loginFrame.asp"
frameborder=0 noResize width=100 scrolling=no height=30 vspale="0"/iframe
% else %
您没有登陆哈 欢迎光临站长资讯网:http://www.Net118.com
% end if %


如果你是细心之人马上就知道下面我么要做的是loginFrame.asp
!--#include file="loginCONN.ASP" --
% CONN_Net118.Execute("Update onlyLogin Set OLtime='"& NOW() & "' where OLname = ' "& Session("lgName") & "'") %
htmlheadmeta http-equiv="refresh" content="%=(maxTime-5)%; url=""/head/html

好了到此为止我们的程序就完成了,这个程序的关键就是判定用户是否在线,而我也是无可奈何的是用了FRAME把定时刷新确定用户在线的关键性叶面嵌套在主程序的叶面里,实际的操作中你可以把那个iframe的宽和高改为0让一般用户看不到,或者让主程序的网页底色和那个嵌套进来的定时刷新的网页一样就ok了。
前不久在讨论区看到有人说用session和cookies之类的东西也能判定,这显然是不可能的呀,因为他们生成的对象都是对自己起作用的,其数据内容根本无法和其他用户共用。appliaction应该是实现这一目的的另一种方法,但是我一想到如果同是有很多用户登陆要为每个用户生成至少一个到三个appliaction对象就放弃了这个念头,因为那样我们原本可怜的服务器一定会被拖垮~

来源:http://www.tulaoshi.com/n/20160219/1600995.html

延伸阅读
  http://dev.csdn.net/article/53/53442.shtm 如何将几个DBGRID里的内容导入同一个EXCEL表中? 在软件实际制作中,为节省开发成本和开发周期,一些软件人员通常会吧DBGrid中的数据直接导出到Excel表中,而先前能看到的函数仅仅只能在WorkBook的一个Sheet中导入数据,不支持多Sheet!。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...
就是当你登陆系统后, 知道你账号密码的另一个人就无法登陆系统。 除非你离开系统。 请赐教 :roll: sakulagi 回复于:2004-02-20 20:14:03 控制用户或者组用户在同一时间内登陆的个数 首先在/etc/pam.d/login中加上 session required /lib/security/pam_limits.so 然后在/etc/security/limits.conf加上要限制的用户名 例如 : edward ...
微信登陆多个账号 一个手机登陆多个微信教程   你还在一个手机单独登陆一个微信么?其实手机可以实现同时登陆多个微信哦,我们一起来看看怎么做吧? 原理: 模拟手机安装多个微信,每一个微信都可以独立登陆账号。 具体教程: 手机安装微信多账号应用,开启微信多账号应用。点击安装一个微信需要登几个,就安装几个...
标签: 十二星座 星座
像电视剧中经常会上演 好朋友爱上同一个人 的戏码,对于这种剧情和主角的选择你怎么看?其实现实中这样的事情也有很多,如果你真的和你的好朋友爱上同一个人怎么办?下面跟图老师小编小编做下面的心理测试题,根据你们爱上同一个人之后的选择看你的爱情观是什么样的! 如果有一天,你和你的好朋友同时爱上了同一个人,你会怎么办? A、不择手...
标签: PS
ps怎么把多张图导入到同一个图层?   今天制作Gif的时候,需要导入多张帧图到同一个图层。最开始采用视频转Gif录制或者转换做动态图,结果弄出来图质量走样了。最后选择一帧一帧导入图到PS。突然发现有80多张,于是找到一键导入多图到同个图层的方法,特此记录并分享给大家。 方法一: 1、先将需要添加的导入的图片,单独存...

经验教程

588

收藏

47
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部