實現這個功能可有兩種方式:
1。 application
用application物件:如果做的是大型社區,可能要為每個登陸id生成一個appliaction,這樣做雖然程式上設計會簡單些但登陸用戶過多及其耗費伺服器資源,這裡決不提倡,因為appliaction對象在用戶登陸時生成很容易, 但是要做到真正的隨著用戶退出系統完全釋放,到目前還沒看到更好的方法~
<%
.....取使用者名稱username.....
ifApplication(username)<>then
response.write該使用者已登入
response.end
endif
Application(username)=username''存入該使用者的使用者名稱
%>
在global檔案中加上sessiononend事件,下線時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 不 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.OpenSelect * 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>
到此程序就完成了,這個程式的關鍵就是判定使用者是否在線