〓簡介〓 有點常識的人都知道本身用asp做這種功能顯然有些牽強(qiáng),因為他不像qq,msn或irc 聊天室那樣是即時通訊,他都是靠刷新網(wǎng)頁更改最后活動時間來獲取用戶是否在線的,所以您不要指望下面這片教程有多完美,我也只是把我的思維模式記錄下來,有啥不對的地方還請高手們多多指教! -------------------------------------------------------------------------------- 〓正文〓 首先我先向大家介紹一下我實現(xiàn)這個效果的思路,如果你看過我的思路后就能理解完全沒必要將這篇東西看完……
實現(xiàn)這個功能我只能想到兩種方式來實現(xiàn): 1。數(shù)據(jù)庫+asp 做起來可能會復(fù)雜些,但是適合有大量登陸用戶的系統(tǒng)里。
2。application 用application對象:如果你做的是大型社區(qū),你可能要為每個登陸id生成一個appliaction,這樣做雖然程序上設(shè)計會簡單些但登陸用戶過多及其耗費服務(wù)器資源,我這里決不提倡,因為appliaction對象在用戶登陸時生成很容易但是要做到真正的隨著用戶退出系統(tǒng)完全釋放掉,到目前我還沒看到更好的方法~
因此還是讓我們來看看用數(shù)據(jù)庫+asp是如何實現(xiàn)同一個帳號不能同時登陸的問題的吧!
首先問用戶建立數(shù)據(jù)庫這里我們用access新建一個onlyTOL8.mdb
數(shù)據(jù)表1: users 存放用戶注冊資料 下設(shè)數(shù)據(jù)表:uID(自動編號) userName(字符型) userPass(字符型)
數(shù)據(jù)表2: onlyLogin 存放用戶臨時登陸信息 下設(shè)數(shù)據(jù)表: OLname(字符型) OLtime(日期型) OLip(字符型)
數(shù)據(jù)庫建好后我們直接向users表中手動添加數(shù)據(jù) userName表添加TOL8,userPass表里添加111,為了能突出我們本文討論的重點,去掉不必要的廢話,所以密碼也不要加密了,用戶名也自己添加~哈哈~
好了,現(xiàn)在數(shù)據(jù)庫里面有用戶數(shù)據(jù)庫,下面我們來做用戶登陸界面,復(fù)制下面代碼存成onlyLogin.asp文件。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>TOL8.COM禁止同一賬號不同地區(qū)同時登陸</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文件復(fù)制下面的代碼保存!是連接數(shù)據(jù)庫的,這個我就不多解釋了…… <% 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文件也存在這個目錄下,這個比較關(guān)鍵,仔細(xì)看下面的代碼: <!--#include file="loginCONN.asp" --> <% '刪除maxTime時間內(nèi)部活動的用戶,maxTime 在loginCONN.asp文件里面已經(jīng)定義好了 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 not rs.eof then Call isOK(userName) ' 用戶名密碼正確調(diào)用次過程,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 ' 數(shù)據(jù)庫中當(dāng)前登陸用戶名保存的ip Dim Oltime ' 數(shù)據(jù)庫中當(dāng)前登陸用戶名保存的最后刷新網(wǎng)頁的時間,是計算用戶是否在線的重要數(shù)據(jù)。 Dim OLip1 ' 記錄當(dāng)前用戶登陸ip,用來區(qū)分是否為同一用戶的標(biāo)示 OLip1=Request.ServerVariables("REMOTE_ADDR")'取得提交登陸信息用戶的IP Set ts=Conn_TOL8.execute("Select * FROM onlyLogin WHERE OLname='"& userName & "'") if not ts.eof then ' 查詢數(shù)據(jù)庫是否有此用戶的登陸過的信息 OLtime=ts("OLtime") OLip=ts("OLip") if OLip1<>OLip and DateDiff("s",OLtime,now()) < maxTime then '上句判斷如果提交登陸用戶ip不是數(shù)據(jù)庫中最后紀(jì)錄的用戶ip并且 '用戶的最后活動時間和當(dāng)前時間相隔并沒超過規(guī)定的秒數(shù)則確認(rèn)此用戶當(dāng)前在線 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 '如果數(shù)據(jù)庫沒有次登陸用戶紀(jì)錄則執(zhí)行下面的語句 Dim ls Set ls=Server.CreateObject("ADODB.RECORDSET") ls.Open"Select * 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 %>
出處:
責(zé)任編輯:帥青蛙
上一頁 下一頁 同一個帳號不能同時登陸的問題 [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|