佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 同一個(gè)帳號不能同時(shí)登陸的問題

同一個(gè)帳號不能同時(shí)登陸的問題

熱門標(biāo)簽:團(tuán)購網(wǎng)站 銀行業(yè)務(wù) 電子圍欄 服務(wù)器配置 科大訊飛語音識別系統(tǒng) Mysql連接數(shù)設(shè)置 Linux服務(wù)器 阿里云

〓簡介〓
有點(diǎn)常識的人都知道本身用asp做這種功能顯然有些牽強(qiáng),因?yàn)樗幌駋q,msn或irc 聊天室那樣是即時(shí)通訊,他都是靠刷新網(wǎng)頁更改最后活動(dòng)時(shí)間來獲取用戶是否在線的,所以您不要指望下面這片教程有多完美,我也只是把我的思維模式記錄下來,有啥不對的地方還請高手們多多指教!
--------------------------------------------------------------------------------
〓正文〓
首先我先向大家介紹一下我實(shí)現(xiàn)這個(gè)效果的思路,如果你看過我的思路后就能理解完全沒必要將這篇東西看完……

實(shí)現(xiàn)這個(gè)功能我只能想到兩種方式來實(shí)現(xiàn):
1。數(shù)據(jù)庫+asp
做起來可能會(huì)復(fù)雜些,但是適合有大量登陸用戶的系統(tǒng)里。

2。application
用application對象:如果你做的是大型社區(qū),你可能要為每個(gè)登陸id生成一個(gè)appliaction,這樣做雖然程序上設(shè)計(jì)會(huì)簡單些但登陸用戶過多及其耗費(fèi)服務(wù)器資源,我這里決不提倡,因?yàn)閍ppliaction對象在用戶登陸時(shí)生成很容易但是要做到真正的隨著用戶退出系統(tǒng)完全釋放掉,到目前我還沒看到更好的方法~

因此還是讓我們來看看用數(shù)據(jù)庫+asp是如何實(shí)現(xiàn)同一個(gè)帳號不能同時(shí)登陸的問題的吧!

首先問用戶建立數(shù)據(jù)庫這里我們用access新建一個(gè)onlyNet118.mdb

數(shù)據(jù)表1: users 存放用戶注冊資料
下設(shè)數(shù)據(jù)表:uID(自動(dòng)編號) userName(字符型) userPass(字符型)

數(shù)據(jù)表2: onlyLogin 存放用戶臨時(shí)登陸信息
下設(shè)數(shù)據(jù)表: OLname(字符型) OLtime(日期型) OLip(字符型)

數(shù)據(jù)庫建好后我們直接向users表中手動(dòng)添加數(shù)據(jù) userName表添加Net118,userPass表里添加111,為了能突出我們本文討論的重點(diǎn),去掉不必要的廢話,所以密碼也不要加密了,用戶名也自己添加~哈哈~

好了,現(xiàn)在數(shù)據(jù)庫里面有用戶數(shù)據(jù)庫,下面我們來做用戶登陸界面,復(fù)制下面代碼存成onlyLogin.asp文件。
html>
head>
meta http-equiv="Content-Type" content="text/html; charset=gb2312">
title>Net118.COM禁止同一賬號不同地區(qū)同時(shí)登陸/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>


完成后在新建一個(gè)loginCONN.asp文件復(fù)制下面的代碼保存!是連接數(shù)據(jù)庫的,這個(gè)我就不多解釋了……
%

Dim CONN_Net118
Dim Conn_T
Dim mmdd
mmdd="onlyNet118.mdb"
Set CONN_Net118 = Server.CreateObject("ADODB.Connection")
Conn_T="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" Server.MapPath(""mmdd"")
on error resume next
CONN_Net118.Open Conn_T

%>

 

下面我們做一個(gè)loginPost.asp文件也存在這個(gè)目錄下,這個(gè)比較關(guān)鍵,仔細(xì)看下面的代碼:
!--#include file="loginCONN.asp" -->
%
'刪除maxTime時(shí)間內(nèi)部活動(dòng)的用戶,maxTime 在loginCONN.asp文件里面已經(jīng)定義好了
Conn_Net118.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_Net118,1,1
IF not rs.eof then
Call isOK(userName) ' 用戶名密碼正確調(diào)用次過程,isOK將會(huì)在下面的程序中定制。
else
Response.Write("a href=javascript:history.go(-1)>用戶名或密碼錯(cuò)誤/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ì)算用戶是否在線的重要數(shù)據(jù)。
Dim OLip1 ' 記錄當(dāng)前用戶登陸ip,用來區(qū)分是否為同一用戶的標(biāo)示
OLip1=Request.ServerVariables("REMOTE_ADDR")'取得提交登陸信息用戶的IP
Set ts=Conn_Net118.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)時(shí)間和當(dāng)前時(shí)間相隔并沒超過規(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_Net118,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 %>
如果你看得懂a(chǎn)sp文件一看便知道登陸成功后葉面會(huì)跳轉(zhuǎn)到loginOK.asp下面我們馬上看看這個(gè)葉面的代碼吧
style type="text/css">
!--
body {background-color: #FF9900;}
-->
/style>
% IF Session("lgName")>"" then %>
您登陸成功了?。?!下面是潛入網(wǎng)頁內(nèi)的iframe為的是在規(guī)定的時(shí)間刷新網(wǎng)頁向服務(wù)器報(bào)告你是否在線
為了便于區(qū)分,frame網(wǎng)頁我們采用了白色作為底色
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 %>
您沒有登陸哈 歡迎光臨站長資訊網(wǎng):http://www.Net118.com
% end if %>


如果你是細(xì)心之人馬上就知道下面我么要做的是loginFrame.asp
!--#include file="loginCONN.ASP" -->
% CONN_Net118.Execute("Update onlyLogin Set OLtime='" NOW() "' where OLname = ' " Session("lgName") "'") %>
html>head>meta http-equiv="refresh" content="%=(maxTime-5)%>; url="">/head>/html>

好了到此為止我們的程序就完成了,這個(gè)程序的關(guān)鍵就是判定用戶是否在線,而我也是無可奈何的是用了FRAME把定時(shí)刷新確定用戶在線的關(guān)鍵性葉面嵌套在主程序的葉面里,實(shí)際的操作中你可以把那個(gè)iframe的寬和高改為0讓一般用戶看不到,或者讓主程序的網(wǎng)頁底色和那個(gè)嵌套進(jìn)來的定時(shí)刷新的網(wǎng)頁一樣就ok了。
前不久在討論區(qū)看到有人說用session和cookies之類的東西也能判定,這顯然是不可能的呀,因?yàn)樗麄兩傻膶ο蠖际菍ψ约浩鹱饔玫模鋽?shù)據(jù)內(nèi)容根本無法和其他用戶共用。appliaction應(yīng)該是實(shí)現(xiàn)這一目的的另一種方法,但是我一想到如果同是有很多用戶登陸要為每個(gè)用戶生成至少一個(gè)到三個(gè)appliaction對象就放棄了這個(gè)念頭,因?yàn)槟菢游覀冊究蓱z的服務(wù)器一定會(huì)被拖垮~

標(biāo)簽:大理 衢州 江蘇 衡水 廣元 萍鄉(xiāng) 蚌埠 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《同一個(gè)帳號不能同時(shí)登陸的問題》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    四川省| 年辖:市辖区| 黑龙江省| 邻水| 耿马| 吴忠市| 翁牛特旗| 株洲县| 苍山县| 灵川县| 四川省| 永平县| 铁力市| 南投市| 敦煌市| 祁门县| 泾川县| 皋兰县| 团风县| 普洱| 博白县| 瑞金市| 枣庄市| 甘泉县| 时尚| 周宁县| 庆云县| 修武县| 石渠县| 织金县| 财经| 道孚县| 兴义市| 固始县| 五莲县| 莫力| 海口市| 松阳县| 潮安县| 石林| 固安县|