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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章