2013-03-06 63 views
0

我想從我的訪問ColdFusion應用程序不止一次在同一時間阻止用戶。阻止用戶在網站上

我有dtlogin,請dtLogLastUpdate,IP和isLogged SQL表。

邏輯是:

會話超時時間爲1小時。

當用戶登錄時,

  • 組的Dtlogin =郵戳現在
  • dtLogLastUpdate =郵戳現在
  • IP =用戶IP
  • isLogged = 1

我使用每1分鐘更新一次AJAX呼叫更新dtLogLastUpdate

當我得到用戶的登錄請求時,只允許它在isLogged爲0或dtLogLastUpdate超過我的會話超時。

如何管理,當用戶關閉瀏覽器,但之前不註銷?他們需要等到會話超時嗎?

+2

我會考慮使用onSessionEnd以自動方式記錄人員。這將處理關閉瀏覽器的人員。另外,如果瀏覽器關閉,則DtLogLastUpdated將爲x分鐘。如果瀏覽器已打開並正在進行ajax調用,則會話將保持活動狀態,並使dtLogLastUpdated保持最新狀態。您可能還想要搜索「coldfusion誰在線」應用程序。那裏有一個可能提供代碼樣本的舊版本。 – steve 2013-03-06 21:19:00

+0

也許你可以註銷'舊用戶'並允許'新用戶'登錄。 – 2013-03-06 21:19:44

+0

你不能比較'dtLogLastUpdate'到當前時間嗎?如果它在一分鐘內還沒有ping通,我認爲你可以假設他們關閉了他們的標籤 – 2013-03-06 21:19:44

回答

2

我會創建一個名爲currentUsers應用程序變量。

您可以使用數組或列表,我認爲陣列功能,更快,但具體取決於您的ColdFusion版本的搜索數組可以是一個痛苦。爲了簡單起見,我將使用列表函數。

當用戶試圖登錄,檢查列表中的用戶名。如果不存在,請將用戶名添加到列表中,並允許他們登錄。如果用戶名存在,請將其發送到某個默認的「太糟糕,非常悲傷」的登錄頁面。

<cfif listFindNoCase(application.currentUsers, form.userName)> 
    <cflocation url = "shameOnYou.cfm"> 
<cfelse> 
    <cfset listAppend(application.currentUsers, form.userName)> 
    <cfset session.whatever> 
</cfif> 

在您的application.cfc中,使用onSessionEnd從列表中刪除用戶名。

<cffunction onSessionEnd...> 
    <cfset listDeleteAt(application.currentUsers,listFind(application.currentUsers, session.userName))> 
</cffunction> 

這樣做的好處是,你不需要使用AJAX來更新日誌文件每隔60秒,減少後臺進程。

+1

您可能會提到,其缺點是用戶需要等到會話過期(OP的情況下1小時)才能再次登錄。當他們沒有正確註銷時。 – 2013-03-07 01:28:53

+0

如果他使用J2EE會話管理,則不需要。 – Travis 2013-03-07 01:32:23

+0

如果他們關閉他們現有的瀏覽器(全部)並打開一個新的瀏覽器。我在上面的評論中也提到過。這是你所指的嗎? – 2013-03-07 01:34:22