您所在的位置:小祥子 » 编程 » ASP » 正文

ASP防止多人同时登录、获取在线列表、实现登录日志

时间:2015-01-19 编辑:佚名 来源:互联网

ASP 实现同一帐号,防止多人同时登录、获取在线列表、实现登录日志(可用户统计在线时长),适合用户访问量大的系统

connAccess.asp文件
<%
dim strconn
Set con=Server.CreateObject("ADODB.Connection")
strconn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.mappath("db/#testdb.mdb")&";"
con.Open strconn

Dim maxTime '定义刷新时间及在线时间间隔,可以根据实际更改,推荐使用300即300秒5分钟
maxTime=120
Session.Timeout=5
 

'程序功能:
'1、同用户名不同IP的不能同时登录(虽然出现共用IP的局域网,但这个方法在地域上做了限制,是目前最好的了)
'2、建立在线用户列表
'3、建立登录日志,可以计算在线时长
'4、因为采用数据库,而不是Application和Session记录在线数组,所以可以减少服务器的负荷,适合于用户访问量较大的网站
'作者:天使不在线,小刀
'最后修改日期2009-01-01

'表 users id(主键自动增加) userName userPass
'表 onlyLogin id(主键自动增加) userid(外键) olname olstarttime ollasttime olip
'表 log id(主键自动增加) userid(外键) olname olstarttime ollasttime olip

%>

loginForm.asp文件
<body>
<form name="form1" method="post" action="loginPost.asp">
<table>
<tr><td>用户名</td><td><input type="text" name="userName" /></td></tr>
<tr><td>密码</td><td><input type="password" name="userPass"/></td></tr>
<tr><td><input type="Submit" value="Login" name="Sumbit" /></td><td><input type="reset" value="重置" /></td></tr>
</table>
</form>
</body>

loginPost.asp文件 重要的文件
<!--#include file="inc/connAccess.asp"-->
<body>
<%
'删除maxTime时间内活动的用户,maxTime在数据库连接文件里面定义好
Dim nowtime
nowtime=now() '确定一个确切的时间,防止程序运行慢,导致两条语句时间参数不同
'在日志文件中插入已经退出或者掉线的用户
insertStr="insert into log (userid,olname,olstarttime,ollasttime,olip) "&_
"select userid,olname,olstarttime,ollasttime,olip from onlyLogin "&_
" where datediff('s',ollasttime,'"&nowtime&"')>"&maxTime
con.execute(insertStr)
con.execute("delete from onlyLogin where datediff('s',ollasttime,'"&nowtime&"')>"&maxTime&"")
'注意这里的maxTime旁边的引号,在access中测试 datediff的只和没有引号的数字比较

Dim rs,ts,txt,sql,userName,userPass
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,con,1,1
If not rs.eof Then
Call isOk(rs("id"))
Else
Response.Write("用户名和密码错误")
rs.close()
set rs=nothing
con.close()
set con=nothing
response.End()
End If
rs.close()
set rs=nothing

Sub isOk(userid)
Dim Olip '数据库中当前登录用户名保存的ip
Dim Oltime '数据库中当前登录用户名保存的最后刷新网页的时间
Dim Olip1 '记录当前用户登录ip,用来区分是否为同一
Olip1=Request.ServerVariables("REMOTE_ADDR") '这里可能还有另外一种情况,大家可以讨论一下
Set ts=con.execute("select * from onlyLogin where userid="&userid)
If Not ts.Eof Then
OLlasttime=ts("OLlasttime")
OLip=ts("OLip")
ts.close
set ts=nothing
'判断如果提交登录用户ip不是数据库中最后记录的用户ip,并且用户的最后活动时间和当前时间相隔并没超过规定的秒数则确定此

用户当前在线
If OLip1<>OLip And DateDiff("s",OLlasttime,now())< maxTime Then
Response.Write("此用户目前在线,可能是如下原因<br>")
Response.Write("1、次用户已经登录,禁止同一帐号同时登录;<br>")
Response.Write("2、非正常退出,请等候5分钟再重新登录;<br>")
Else
Session("lgUserid")=userid
Session("lgName")=rs("userName")
Response.Redirect("loginOK.asp")
Response.End()
End If
Else
'如果数据库没有再次登录用户记录,则执行下面的语句
Dim ls
Set ls=Server.CreateObject("ADODB.RECORDSET")
ls.Open "select * from onlyLogin",con,2,2
ls.addNew
ls("userid")=userid
ls("OLname")=rs("userName")
ls("Olip")=Olip1
ls("Olstarttime")=now
ls("Ollasttime")=now
ls.Update
ls.close
set ls=Nothing
Session("lgUserid")=userid
Session("lgName")=rs("userName")
Response.Redirect("loginOK.asp")
Response.End()
End If
End Sub

%>
</body>


loginOk.asp 登录成功文件
<body>
<%
'程序功能:
'1、同用户名不同IP的不能同时登录(虽然出现共用IP的局域网,但这个方法在地域上做了限制,是目前最好的了)
'2、建立在线用户列表
'3、建立登录日志,可以计算在线时长
'4、因为采用数据库,而不是Application和Session记录在线数组,所以可以减少服务器的负荷,适合于用户访问量较大的网站
'作者:天使不在线,小刀
'最后修改日期2009-01-01
If Session("lgUserid")<>"" Then
%>
<%=Session("lgName")%>登录成功
<br>
<%
Response.Write("Session.Timeout:" & Session.Timeout)
%>
<br>
<!--iframe占用IIS个数,此处可使用Ajax -->
<iframe border=0 name="new_date" marginwidth="0" frameborder="0" marginheight="0" src="loginFrame.asp" noResize

width="400"></iframe>
<br>
<a href="online.asp" target="_blank">查看在线用户</a><br>
<a href="log.asp" target="_blank">查看用户登录日志(可计算在线时间)</a><br>
<a href="loginOut.asp" target="_self">安全退出</a>
<%
End If
%>
</body>

loginFrame.asp
<body>
<%
If Session("lgUserid")<>"" Then
'为logout.asp打补丁,防止利用logout.asp在不用ip下重复登录
Dim newIp
newIp=Request.ServerVariables("REMOTE_ADDR")
set rs=Server.CreateObject("ADODB.Recordset")
sqlstr="select * from onlyLogin where userid="&Session("lgUserid")
rs.Open sqlstr,con,1,3
If rs.Eof Then
Session.Abandon()
rs.close
set rs=nothing
Response.Redirect("loginForm.asp")
Response.End()
ElseIf rs("olip")<>newIp Then
Session.Abandon()
rs.close
set rs=nothing
Response.Redirect("loginForm.asp")
Response.End()
End If

con.execute("update onlyLogin set OLlasttime='"&Now&"' where userid="&Session("lgUserid"))

End If
%>
</body>

Global.asa 全局文件
<Script Language=VBScript RunAt=Server>

Sub Application_OnStart()
set Application("con")=Server.CreateObject("ADODB.Connection")
Application("db")=Server.MapPath("db/#testdb.mdb") '此处要使用绝对路径
End Sub

Sub Application_OnEnd()

End Sub

Sub Session_OnStart()

End Sub

Sub Session_OnEnd()
'登录后的用户Session过期时才生效
If Session.contents("lgUserId")<>"" Then
'在Session_OnEnd事件中不能用session("lgUserId")来代替session.contents("lgUserId")
dim strconn
strconn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Application("db")&";"
'在Application和Session的OnEnd事件里不能使用Server对象,所以要将数据库的连接存储在application变量中,
'并在Application_OnStart事件中预先处理
Application("con").Open strconn
Dim maxTime '定义刷新时间及在线时间间隔,可以根据实际更改,推荐使用300即300秒5分钟
maxTime=120
Dim nowtime
nowtime=now()
insertStr="insert into log (userid,olname,olstarttime,ollasttime,olip) "&_
"select userid,olname,olstarttime,ollasttime,olip from onlyLogin "&_
" where datediff('s',ollasttime,'"&nowtime&"')>"&maxTime
Application("con").execute(insertStr)
Application("con").execute("delete from onlyLogin where datediff('s',ollasttime,'"&nowtime&"')>"&maxTime&"")
Application("con").execute("update try set num=num+1")
Application("con").close
End If
End Sub

</Script>

退出登录文件 loginOut.asp
<body>
<%
If Session("lgUserId")<>"" Then
'登录用户安全退出时执行的操作
insertStr="insert into log (userid,olname,olstarttime,ollasttime,olip) "&_
"select userid,olname,olstarttime,ollasttime,olip from onlyLogin "&_
" where userid="&Session("lgUserId")
con.execute(insertStr)
con.execute("delete from onlyLogin where userid="&Session("lgUserId"))
Session.Abandon()
Response.Redirect("loginForm.asp")
End If
%>
</body>

获取在线用户列表 online.asp
<!--#include file="inc/connAccess.asp"-->
<body>
<h3 align="center">在线列表</h3>
<table width="80%" border="1" align="center">
<tr>
<td>序号</td>
<td>用户序号</td>
<td>用户名称</td>
<td>登录时间</td>
<td>最后活动时间</td>
<td>登录IP</td>
</tr>
<%
Dim sqlStr
sqlStr="select * from onlyLogin order by id desc"
Set rs=Server.CreateObject("ADODB.RecordSet")
rs.Open sqlStr,con,1,3
Do While Not rs.Eof
%>
<tr>
<td><%=rs("id")%></td>
<td><%=rs("userid")%></td>
<td><%=rs("olName")%></td>
<td><%=rs("Olstarttime")%></td>
<td><%=rs("Ollasttime")%></td>
<td><%=rs("Olip")%></td>
</tr>
<%
rs.MoveNext
Loop
rs.close
set rs=nothing
con.close
set con=nothing
%>
</table>
</body>

登录日志文件 log.asp
<body>
<h3 align="center">登录日志列</h3>
<table width="80%" border="1" align="center">
<tr>
<td>序号</td>
<td>用户序号</td>
<td>用户名称</td>
<td>登录时间</td>
<td>最后活动时间</td>
<td>在线时长(分钟)</td>
<td>登录IP</td>
</tr>
<%
Dim sqlStr
sqlStr="select id,userid,olName,olstarttime,ollasttime,datediff('n',olstarttime,ollasttime) " &_
"as difftime,Olip from log order by id desc"
Set rs=Server.CreateObject("ADODB.RecordSet")
rs.Open sqlStr,con,1,3
Do While Not rs.Eof
%>
<tr>
<td><%=rs("id")%></td>
<td><%=rs("userid")%></td>
<td><%=rs("olName")%></td>
<td><%=rs("Olstarttime")%></td>
<td><%=rs("Ollasttime")%></td>
<td><%=rs("difftime")%></td>
<td><%=rs("Olip")%></td>
</tr>
<%
rs.MoveNext
Loop
rs.close
set rs=nothing
con.close
set con=nothing
%>
</table>
</body>

关键词: