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

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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值