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>