史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 程式 & 網頁設計技術文件
忘記密碼?
註冊帳號 論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2006-05-25, 04:01 PM   #1 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 軟體 - 同一個帳號不能同時登陸的問題

═簡介═
有點常識的人都知道本身用asp做這種功能顯然有些牽強,因為他不像qq,msn或irc 聊天室那樣是即時通訊,他都是靠重新整理網頁更改最後活動時間來獲取用戶是否在線的,所以您不要指望下面這片教學有多完美,我也只是把我的思維模式記錄下來,有啥不對的地方還請高手們多多指教!
--------------------------------------------------------------------------------
═正文═
首先我先向大家介紹一下我實現這個效果的思法,如果你看過我的思法後就能理解完全沒必要將這篇東西看完……

實現這個功能我只能想到兩種方式來實現:
1。資料庫+asp
做起來可能會複雜些,但是適合有大量登入用戶的系統裡。

2。application
用application對像:如果你做的是大型社區,你可能要為每個登入id產生一個appliaction,這樣做雖然程序上設計會簡單些但登入用戶過多及其耗費伺服器資源,我這裡決不提倡,因為appliaction對像在用戶登入時產生很容易但是要做到真正的隨著用戶結束系統完全解壓縮掉,到目前我還沒看到更好的方法~

因此還是讓我們來看看用資料庫+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>TOL8.COM禁止同一帳號不同地區同時登入</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 not rs.eof then
Call isOK(userName) ' 用戶名密碼正確使用次程序,isOK將會在下面的程序中設定。
else
Response.Write("<a href=java script: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=java script: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.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 %>
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1625 篇, 收花: 3188 次
舊 2006-05-25, 05:12 PM   #2 (permalink)
管理版主
 
superxboy 的頭像
榮譽勳章
UID - 21259
在線等級: 級別:55 | 在線時長:3350小時 | 升級還需:10小時級別:55 | 在線時長:3350小時 | 升級還需:10小時級別:55 | 在線時長:3350小時 | 升級還需:10小時級別:55 | 在線時長:3350小時 | 升級還需:10小時級別:55 | 在線時長:3350小時 | 升級還需:10小時
註冊日期: 2003-01-02
住址: 北極
文章: 10290
現金: 0 金幣
資產: 746021397 金幣
預設

引用:
作者: psac
═簡介═
有點常識的人都知道本身用asp做這種功能顯然有些牽強,因為他不像qq,msn或irc 聊天室那樣是即時通訊,他都是靠重新整理網頁更改最後活動時間來獲取用戶是否在線的,所以您不要指望下面這片教學有多完美,我也只是把我的思維模式記錄下來,有啥不對的地方還請高手們多多指教!
--------...
我也是用差不多的方法...=.=...不過我有在Global.asa中去判斷使用者是否未正常登出...只要IIS沒掛的話...使用者的Session一旦TimeOut的話...就會清空資料庫的SessionID值...若是IIS掛掉...則沒有清空...下次使用者一登入時...會自動檢查本次的SessionID值和資料庫的SessionID值是否一致...若是不一致...則會先清空上次資料庫記錄的SessionID值...並請使用者重新登入
__________________
http://images.gamebase.com.tw/mybase/32/05/281/happy_card_000002776.jpg
愛的時候,可以不公平;不愛了、分開了,總該公平了吧

重情重義重粉味 愛台愛鄉愛查某
superxboy 目前離線  
送花文章: 3235, 收花文章: 4821 篇, 收花: 21626 次
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 12:53 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2018, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1