您当前的位置是:首页-ASP教程

ASP防止同时登陆的问题

【发表于】:2010/4/20 13:46:00  已被访问:127次
实现这个功能可有两种方式:  
1。application  
用application对象:如果做的是大型社区,可能要为每个登陆id生成一个appliaction,这样做虽然程序上设计会简单些但登陆用户过多及其耗费服务器资源,这里决不提倡,因为appliaction对象在用户登陆时生成很容易, 但是要做到真正的随着用户退出系统完全释放,到目前还没看到更好的方法~  
以下为引用的内容: 
<%   
.....取用户名username.....   
if  Application(username)<>""  then   
     response.write  "该用户已经登录"   
     response.end   
end  if   
Application(username)=username  ..存入该用户的用户名  
%> 
在global文件中加上session  onend事件,下线时Application("isuserlogin")=false   
此外还要检测是否吊线,有专门的办法,是server对象里的某项   
(参: http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=815)  
2。数据库+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>禁止同一账号不同地区同时登陆</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 %> 
登陆成功后叶面会跳转到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 %> 
您没有登陆哈 
以下为引用的内容: 
<% 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> 
到此为止程序就完成了,这个程序的关键就是判定用户是否在线。
 
上下篇: ASP分页和日期格式化为RFC822格式的办法 ASP程序中输出Excel文件实例一则

最新推荐信息