判断一个账户登陆后,另一个人不能再用这个账号登陆?

yuqianloveme 2004-10-05 12:04:38
判断一个账户登陆后,另一个人不能再用这个账号登陆?哪位大侠有这方面的代码呀,我的电子邮箱是:yuqianloveme@163.com
...全文
397 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQgenie 2004-10-06
  • 打赏
  • 举报
回复
聊天室有一功能,就是判断用户20分钟内有无发言,把最后时间与登录时间比较就行了,我们可以判断他有无打开新页。
mrshelly 2004-10-06
  • 打赏
  • 举报
回复
DB_SESSION
19az 2004-10-06
  • 打赏
  • 举报
回复
多半都是采用数据库存储来实现的,关键要解决的问题就是 用户直接关闭浏览器所面临的问题,前面朋友提到了用Session_OnEnd事件中进行处理,但是这必须要等到Session彻底失效后才会执行,那么在Session失效之前,难道用户再想登录就不可以了吗?

求更好的解决办法!!!
Amely 2004-10-06
  • 打赏
  • 举报
回复
实现这个功能我只能想到两种方式来实现:
1。数据库+asp
做起来可能会复杂些,但是适合有大量登陆用户的系统里。

2。application
用application对象:如果你做的是大型社区,你可能要为每个登陆id生成一个

appliaction,这样做虽然程序上设计会简单些但登陆用户过多及其耗费服务器资源,我这

里决不提倡,因为appliaction对象在用户登陆时生成很容易但是要做到真正的随着用户退

出系统完全释放掉,到目前我还没看到更好的方法~

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

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

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

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

数据库建好后我们直接向users表中手动添加数据 userName表添加TOL8,userPass表里添

加111,为了能突出我们本文讨论的重点,去掉不必要的废话,所以密码也不要加密了,用

户名也自己添加~哈哈~

好了,现在数据库里面有用户数据库,下面我们来做用户登陆界面,复制下面代码存成

onlyLogin.asp文件。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>TOL8.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_TOL8
Dim Conn_T
Dim mmdd
mmdd="onlyTOL8.mdb"
Set CONN_TOL8 = Server.CreateObject("ADODB.Connection")
Conn_T="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &

Server.MapPath(""&mmdd&"")
on error resume next
CONN_TOL8.Open Conn_T %>



下面我们做一个loginPost.asp文件也存在这个目录下,这个比较关键,仔细看下面的代码


<!--#include file="loginCONN.asp" -->
<%
'删除maxTime时间内部活动的用户,maxTime 在loginCONN.asp文件里面已经定义好了
Conn_TOL8.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_TOL8,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_TOL8.execute("Select * FROM onlyLogin WHERE OLname='"& userName &

"'")
if not ts.eof then ' 查询数据库是否有此用户的登陆过的信息
OLtime=ts("OLtime")
OLip=ts("OLip")
if OLip1<>OLip 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_TOL8,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.TOL8.com
<% end if %>


如果你是细心之人马上就知道下面我么要做的是loginFrame.asp
<!--#include file="loginCONN.ASP" -->
<% CONN_TOL8.Execute("Update onlyLogin Set OLtime='"& NOW() & "' where OLname

= ' "& Session("lgName") & "'") %>
<html><head><meta http-equiv="refresh" content="<%=(maxTime-5)%>;

url=""></head></html>

好了到此为止我们的程序就完成了,这个程序的关键就是判定用户是否在线,而我也是无

可奈何的是用了FRAME把定时刷新确定用户在线的关键性叶面嵌套在主程序的叶面里,实际

的操作中你可以把那个iframe的宽和高改为0让一般用户看不到,或者让主程序的网页底色

和那个嵌套进来的定时刷新的网页一样就ok了。
前不久在讨论区看到有人说用session和cookies之类的东西也能判定,这显然是不可能的

呀,因为他们生成的对象都是对自己起作用的,其数据内容根本无法和其他用户共用。

appliaction应该是实现这一目的的另一种方法,但是我一想到如果同是有很多用户登陆要

为每个用户生成至少一个到三个appliaction对象就放弃了这个念头,因为那样我们原本可

怜的服务器一定会被拖垮~

此教程首发www.TOL8.com
其他网站转载收录请注明出处: 今晚在线 by 我容易么我
高手如有其他高见联系我QQ:24733500 或到 http://TOL8.com/bbs 的ASP版区

=================================
如果你想先测试一下他的效果,拉上两个以上的朋友一起到这里登陆
登陆名:TOL8
密码:111
演示地址:http://www.TOL8.com/web/asp/onlyLogin.asp

下载源文件:http://www.tol8.com/web/asp/onlyLogin.rar

yb2008 2004-10-06
  • 打赏
  • 举报
回复
用Application对象函数:


Application_Onstart


Application_OnEnd
mrshelly 2004-10-05
  • 打赏
  • 举报
回复
在登陆页子里判断.

if(已经登陆标志) 显示出错信息. //标志可以放在 数据库对应用户表的对应对户字段里.

else
....

设置该用户登陆标志.


shmr 2004-10-05
  • 打赏
  • 举报
回复
大概有2种方法来做:
1.使用application对象来存储已经登陆的信息
2.使用数据库来存储已经登陆的信息。
对于使用application,其实他是保存在服务器内存中的变量,多了当然就影响速度了,如果网站访问量大就不要使用了。
用得最多的还是数据库,在用户表中增加一个字段,用来保存用户的登陆状态信息,登陆后值为1,登出后值为0,如果另外一个人再想登陆,但状态信息为1,就不让其登陆。
但有一个特别容易忽略的要点,如果用户没有登出,直接关掉浏览器,那么他的信息就永远为1了,就永远在线,解决的方法是在Session_OnEnd事件中写入登出代码,这样,如果用户关掉浏览器后,隔一定时间,就自动执行登出代码。至于要隔多少时间内,要看Session的连接时间,默认为20分钟。
itakeblue 2004-10-05
  • 打赏
  • 举报
回复
用户登陆时遍历application。。。

28,390

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧